- 1. 如何正確獲取Javascript對象的類屬性呢?---toString()
由于JS中很多對象繼承toString()被重寫了,為了能正確調(diào)用toString()版本,必須間接調(diào)用Function.call()方法
function classOf(o){
if(o === null) return 'Null';
if(o === undefined) return 'Undefined';
return Object.prototype.toString.call(o).slice(8,-1);
}
測試一下:
classOf({}); //==>"Object"
classOf(''); //==>"String"
classOf(2); //==>"Number"
classOf([]); //==>"Array"
classOf(null); //==>"Null"
classOf(/./); //==>"Regexp"
classOf(new Date()); //==>"Date"
classOf(false) //==>"Boolean"
- 2. JS中可被判定為false的6種情況
js必須牢記的6個蛋蛋: 請你一定要記住:在js邏輯運算中,0、""(空字符)、null、false、undefined、NaN都會判為false,其他都為true,這個一定要記住,不然應(yīng)用 || 和 && 就會出現(xiàn)問題。
- 3. ' !! ' 作用與用法
var a;
var b=!!a;
a默認是undefined。!a是true,!!a則是false,所以b的值是false,而不再是undefined,也非其它值,主要是為后續(xù)判斷提供便利。
!!的作用是把一個其他類型的變量轉(zhuǎn)成的bool類型。
- 4. 變量提升-- 關(guān)鍵字var、let
var a = {b:a} //=>由于var變量提升,在對a進行打印的時候 {b:undefined}
let a = {b:a} //=>let關(guān)鍵字不會造成變量提升,在這樣去定義a變量的時候會報錯 a is not defined
- 5.在js中綁定onclick事件為什么不加括號,在html代碼中必須要加?
加上括號是執(zhí)行的意思,添加事件的回調(diào)函數(shù)應(yīng)該就是給相應(yīng)的事件屬性賦值,而很明顯需要把一個函數(shù)賦值給這個事件屬性,而不是函數(shù)的調(diào)用結(jié)果。所以在js中的綁定是直接賦值。
而在標簽內(nèi)的事件屬性的值是由引號包裹的,代表的是當點擊該元素時,執(zhí)行引號內(nèi)的代碼,直接把引號內(nèi)的代碼拿出來跑,如果你不加括號,那就不會調(diào)用那個函數(shù)。
<a herf="javascript:;" onclick="fn" /> //=> ? fn(){console.log('test')}
<a herf="javascript:;" onclick="fn()" /> //=> test
funciton fn(){
console.log('test')
}
這兩個標簽執(zhí)行時相當于在相應(yīng)的事件里執(zhí)行eval("...")
,第一個標簽點擊時等價于eval("fn")
,輸出函數(shù)fn
的函數(shù)體? fn(){console.log('test')}
,也就是說用戶點擊時并沒有得到想要的結(jié)果;第二個標簽點擊時等價于eval("fn()")
,輸出test
,可以得到目的結(jié)果,所以在html標簽上的事件屬性的值如果是要調(diào)用function
就一定要加()
來保證點擊后可以得到目的結(jié)果。
- 6.在js中
~
、~~
、!!
、|=
、|
、&
、<<
、>>
、>>>
的含義以及用法?
~
按位取反運算符
表達式 | 二進制值 | 結(jié)果 |
---|---|---|
5 | 0000 0101 | 5 |
~5 | 1111 1010 | -6 |
換算的過程如下:
步驟 | 數(shù)值 | 描述 |
---|---|---|
0000 0101 | ||
按位取反 | 1111 1010 | 發(fā)現(xiàn)最高位是1,代表符號-負數(shù) |
除符號位外按位取反 | 1000 0101 | |
末位加1求其補碼 | +?????????????1 | |
結(jié)果 | 1000 0110 | 轉(zhuǎn)換成十進制為-6 |
-
7.JSON.parse()與JSONstringfy()詳細用法
JSON對象包含兩個方法: 用于解析 JavaScript Object Notation (JSON) 的 parse() 方法,以及將對象/值轉(zhuǎn)換為 JSON字符串的 stringify() 方法。除了這兩個方法, JSON這個對象本身并沒有其他作用,也不能被調(diào)用或者作為構(gòu)造函數(shù)調(diào)用,具體參考JSON
。
JSON中嚴格是要使用雙引號""
而不是單引號''
先看MDN上的
JSON.parse()
說明:
JSON.parse()
方法用來解析JSON字符串,構(gòu)造由字符串描述的JavaScript 值或?qū)ο蟆L峁┛蛇x的reviver函數(shù)用以在返回之前對所得到的對象執(zhí)行變換。JSON.parse(text[, reviver])
參數(shù)
text
要被解析成JavaScript值的字符串。reviver
(可選)
轉(zhuǎn)換器, 如果傳入該參數(shù)(函數(shù)),可以用來修改解析生成的原始值,調(diào)用時機在 parse函數(shù)返回之前。返回值
Object
類型, 對應(yīng)給定JSON文本的對象/值
使用示例:JSON.parse('{}'); // {} JSON.parse('true'); // true JSON.parse('"foo"'); // "foo" JSON.parse('[1, 5, "false"]'); // [1, 5, "false"] JSON.parse('null'); // null JSON.parse('1'); // 1
以上的示例都是
JSON.parse()
適用的類型。下面再看一下
JSON.stringfy()
方法:
JSON.stringify()
方法是將一個JavaScript值(對象或者數(shù)組)轉(zhuǎn)換為一個 JSON 字符串,如果指定了replacer是一個函數(shù),則可以替換值,或者如果指定了replacer是一個數(shù)組,可選的僅包括指定的屬性。JSON.stringify(value[, replacer [, space]])
參數(shù)
value
將要序列化成 一個JSON 字符串的值。replacer
(可選)
如果該參數(shù)是一個函數(shù),則在序列化過程中,被序列化的值的每個屬性都會經(jīng)過該函數(shù)的轉(zhuǎn)換和處理;如果該參數(shù)是一個數(shù)組,則只有包含在這個數(shù)組中的屬性名才會被序列化到最終的 JSON 字符串中;如果該參數(shù)為null或者未提供,則對象所有的屬性都會被序列化;關(guān)于該參數(shù)更詳細的解釋和示例,請參考使用原生的 JSON 對象一文。space
(可選)
指定縮進用的空白字符串,用于美化輸出(pretty-print);如果參數(shù)是個數(shù)字,它代表有多少的空格;上限為10。該值若小于1,則意味著沒有空格;如果該參數(shù)為字符串(字符串的前十個字母),該字符串將被作為空格;如果該參數(shù)沒有提供(或者為null)將沒有空格。返回值
一個表示給定值的JSON字符串。
JSON.stringify({}); // '{}' JSON.stringify(true); // 'true' JSON.stringify("foo"); // '"foo"' JSON.stringify([1, "false", false]); // '[1,"false",false]' JSON.stringify({ x: 5 }); // '{"x":5}'
chrome開發(fā)者模式執(zhí)行結(jié)果如下:
可以看到黑色雙引號內(nèi)的內(nèi)容與我們轉(zhuǎn)進行stringfy之前的是一樣的。
我們從這兩個方法看出來parse
方法需要的是單引號,stringfy
執(zhí)行后是雙引號,如果將執(zhí)行結(jié)果復(fù)制再用parse
方法執(zhí)行就會報錯,如果用stringfy
執(zhí)行后結(jié)果賦值給變量,再將這個變量用parse
方法轉(zhuǎn)換就會得到預(yù)期結(jié)果。