-
js的隱式轉換(+和-)
巧用+/-:???? 如果要把一個字符串變數(shù)字,用字符串-0????????? 如果把數(shù)字變字符串,用數(shù)字+0
a===b(類型和數(shù)值都相同)
NAN≠NAN??????? new Object ≠ new Object
a==b
null == undefined????? number == string 轉number(1==“1.0”)
Boolean == ?轉number(1==true)
object == number|string 嘗試將對象轉為基本型? new String('hi') == 'hi'
查看全部 -
js有弱類型特性
js六種數(shù)據(jù)類型:number? string? Boolean? null? undefined?? object(function array date)
查看全部 -
bind方法模擬
在不支持ES5的瀏覽器里模擬bind方法
幾個注意地方:
1.var aArgs=Array.prototype.slice.call(arguments,1);//這里的arguments是相對function(oThis)而言的,也即對應的是oThis這個參數(shù),這個oThis又是對應bind()里面的參數(shù)的,由于bind()第一個參數(shù)是對象,后面還可以是用于currying的參數(shù),所以通過slice將后面的參數(shù)獲取。由于arguments不是標準的數(shù)組,需通過數(shù)組原型鏈的調用來使用slice方法。
2.aArgs.concat(Array.prototype.slice.call(arguments)) //這里的arguments是對應fBound=function()這個匿名函數(shù)的,而fBound作為最后的返回,對應的是函數(shù)bind后賦給的變量(函數(shù)),后者再次調用時傳入的參數(shù)就是這里的arguments,將上面currying的參數(shù)并上后面再傳入的參數(shù),才組成最開始的函數(shù)的參數(shù)this/fToBind。
3.fNOP空對象是為了作為通過new之后消除bind作用后函數(shù)中this指向空對象的原型鏈準備。而通過this instanceof fNOP來判斷是否使用了new,并決定將對象bind上。沒用new,則判斷為false,bind(oThis);否則為true,即使用new,函數(shù)中this指向空對象。查看全部 -
bind方法
不同的調用方法下,this 指向不同的值
module.getX(); //this 指向module,返回 81
var getX = module.getX;
getX(); // this 指向 全局變量,返回9
var boundGetX = getX.bind(module);
boundGetX(); // this 被 bind 向 module,返回81查看全部 -
this指向:
1、直接調用函數(shù)(<function>()):this指向全局對象。
2、方法調用模式(<object>.<function>()):this指向調用者<object>。
3、構造函數(shù)調用模式(obj = new <function>()):this指向被構造者obj。
4、apply/call/bind方法:this指向方法的第一個參數(shù)。
5、嚴格模式下,this不允許指向全局對象,此時this值為undefined。查看全部 -
Array.isArray:判斷是否為數(shù)組
實例:Array.isArray(<val>)
返回值:如果<val>時數(shù)組,則返回true,否則返回false。
注意:當檢測<arr>實例時,isArray方法優(yōu)于instanceof,因為isArray能檢測iframe。
? ? ? 此方法為ES5方法,IE8-不支持。查看全部 -
forEach:遍歷數(shù)組元素的方法,arr.forEach(function(x,index,a){});//x具體的元素值,index對應的下標,a數(shù)組本身
map:數(shù)組映射,var arr=[1,2,3];arr.map(function(x){return x+10;});//[11,12,13] arr;//[1,2,3]不會修改原數(shù)組
filter:數(shù)組過濾,原數(shù)組不被修改,arr.filter(function(x,index){})
every:表示每一個元素都要符合一定的條件 var arr=[1,2,3];arr.every(function(x){return x<10;});//true
some:只要任意一個元素符合條件就可以了,every相當于邏輯與,some相當于邏輯或
reduce:數(shù)組兩個元素兩兩操作var arr=[1,2,3];arr.reduce(function(x,y){return x+y;},0);//6,這里的0是和1最開始進行相加的,每次結果作為新的x,下一個元素作為y,原數(shù)組未被修改
reduceRight:是從右到左開始遍歷的,其他的還是跟reduce一樣的,都可以將數(shù)組聚合成一個結果
indexOf:arr.indexOf(a);//表示元素值為a的所在數(shù)組的下標位置,arr.indexOf(a,i)從下標為i的元素開始查找元素值為a的下標位置
lastIndexOf:與indexOf差不多,只不過是從右到左開始查找的,返回元素所在的下標位置
isArray:判斷是否為數(shù)組,必須用Array構造器對象調用
其他的判斷是否數(shù)組的方法:
[] instanceof Array;//true
({}).toString.apply([])==='[object Array]';//true
[].constructor === Array;//true查看全部 -
1.join()方法 默認是將字符串轉換為字符串,并以“,”隔開元素,而join()中的參數(shù)就是替換字符串中的“,”,
而new Array(n+1).join(str)的原理是,創(chuàng)建一個n+1大小的數(shù)組,若用join()方法會產生含n個“,”的字符串,而str正好代替這些“,”以造成重復n次str參數(shù)的字符串。
2.reverse()方法 將數(shù)組的順序顛倒,注意:原數(shù)組會被改變成顛倒后的數(shù)組。
3.sort()方法 sort()方法只會對數(shù)組進行字符順序上的排序,例如a,b,c,d,而如果是數(shù)字,則會取第一位數(shù)的字符順序進行排序,改完以后原數(shù)組會被修改。如果想用sort進行數(shù)字上的排序,則應寫入函數(shù)參數(shù)function(a,b){return a-b;},這是升序排列,反之降序是b-a。
4.concat()方法 作用是合并數(shù)組,返回值是合并后的數(shù)組,原數(shù)組不會改變。如果參數(shù)是一個一維數(shù)組(沒有嵌套),則合并的時候會拉平數(shù)組,如果是嵌套數(shù)組,合并后只會拉平最外一層。
5.slice()方法 切斷數(shù)組,原數(shù)組不會修改,如果傳入一個參數(shù)n,則返回第n+1個到最后一個元素的數(shù)組,如果傳入n,m,則返回第n+1到m元素的數(shù)組,-1代表最后一個元素,-2代表倒數(shù)第二個元素,以此類推,若輸入的參數(shù)為負數(shù)i,j,則返回倒數(shù)第|i|個到倒數(shù)第|j|+1個元素,總結來說,對于正數(shù),左區(qū)間開,對于負數(shù),右區(qū)間開。
6.splice膠結方法 切斷數(shù)組膠結數(shù)組,原數(shù)組會被修改,輸入?yún)?shù)n,那么原數(shù)組第n+1個元素到最后一個元素都會被刪除(會作為該函數(shù)的返回值),如果輸入?yún)?shù)m,n,則刪除第m+1個到第m+n個元素。如果輸入兩個以上的參數(shù)則刪除前兩個參數(shù)所指定的元素,替換上剩下的參數(shù)。查看全部 -
Object.getOwProertyDescriptor(obj,property_name);<br>
value: 屬性值
writable: 該屬性是否可寫,可改變<br>
enumerable:該屬性是否可被枚舉,就是可在for in中出現(xiàn)<br>
configurable: 該屬性的標簽是否可改變,是否可用delete將該屬性刪除。
用defineProperty定義屬性時,默認configurable為true,如果設置為false后,該屬性不管是什么方式都無法更改。查看全部 -
注意:
1. 用for-in遍歷時,原型鏈上的屬性也會被遍歷到,而且是無序遍歷。
2. 屬性刪除用delete, prototype屬性不可被刪除;var定義的變量也不可用delete刪除,函數(shù)也不可以被delete掉(經(jīng)驗證,不同的內核實現(xiàn)方式不同,在chrome下不可被delete掉,返回false,但在firefox和IE10下可以被delete掉,返回true,對于函數(shù)也是相同的結果)查看全部 -
var obj=Object.create({x:1});
obj.x;//1
typeof obj.toString;//"function" //toString()來源Object源型鏈
obj.hasOwnProperty("x");//false
//原型鏈繼承關系 :
obj->{x:1}->Object prototype ->null;
并不是所有對象都有toString()方法
var obj=Object.create(null);
obj.toString //undefined
此時原型鏈繼承關系 :obj->null。所以無toString()方法查看全部 -
in 和 hasOwnProperty
in是判斷該對象是否具有所要查找的屬性
而hasOwnProperty則是判斷該對象的實例是否具有所要查找的屬性
因此可以自定義一個查找對象屬性所在位置的函數(shù):
function hasProperty(obj,property){
return obj.hasOwnProperty(property) && property in obj;
}//返回true時表示該屬性在它的實例上,否則就在原型上查看全部 -
對象構造:
除了本身被賦予的值之外,對象還有幾個隱藏標簽:
proto:對象的對象屬性prototype上的賦值
class:對象的種類
extensible:是否允許該對象繼續(xù)增加新的屬性
另外對象的值(如 x=1),也有對應的屬性或方法,提供一些訪問權限的控制
writable:是否可寫
enumerable:是否能被刪除
configurable:是否能夠枚舉
value:值
get/set:查看全部 -
特殊運算符的種類:
1、條件運算符 c?a:b c為true 則取a,否則取b
2、逗號運算符 a,b 例如 var s = (1,2,3),則s依次賦值,最后輸出為3
3、delete運算符 delete obj.x 刪除對象obj中的x屬性 ?在IE9下,obj中必須configurable:true 才可以刪除,否則無效
4、in運算符 判斷obj是否有值或window里是否有變量,返回布爾值 例如 attr in json 或 'document' in window
5、instanceof 判斷對象類型 {} instanceof Object // true
6、new運算符 創(chuàng)建一個新對象 new obj / new array ...
7、this對象 全局用指向window,函數(shù)內指向函數(shù)本身,浮動指針
8、typeof 判斷對象,返回對象類型 例如 typeof 100 === 'number' // true
9、void 一元的,判斷所有值,返回均為undefined查看全部 -
過hasOwnProperty()判斷屬性到底是 對象上的 還是 對象的原型鏈上的
查看全部
舉報