1.JavaScript的本地對(duì)象,內(nèi)置對(duì)象和宿主對(duì)象岭参?
1.本地對(duì)象
ECMA-262 把本地對(duì)象(native object)定義為“獨(dú)立于宿主環(huán)境的 ECMAScript 實(shí)現(xiàn)提供的對(duì)象”。
包含內(nèi)容:Object、Function、Array搁进、String、Boolean昔头、Number饼问、Date、RegExp揭斧、Error莱革、EvalError、RangeError讹开、ReferenceError盅视、SyntaxError、TypeError萧吠、URIError左冬。
本地對(duì)象就是 ECMA-262 定義的類(引用類型)桐筏。
2.內(nèi)置對(duì)象
ECMA-262 把內(nèi)置對(duì)象(built-in object)定義為“由 ECMAScript 實(shí)現(xiàn)提供的纸型、獨(dú)立于宿主環(huán)境的所有對(duì)象,在 ECMAScript 程序開始執(zhí)行時(shí)出現(xiàn)”梅忌。而ECMA-262 只定義了兩個(gè)內(nèi)置對(duì)象狰腌,即 Global 和 Math (它們也是本地對(duì)象,根據(jù)定義牧氮,每個(gè)內(nèi)置對(duì)象都是本地對(duì)象)琼腔。
Global(全局對(duì)象):
isNaN()、parseInt()踱葛、parseFloat()丹莲、eval()方法等光坝。
Math:
Math.PI
Math.random() 隨機(jī)數(shù)
Math.random() 區(qū)域+起始值// 30-100整數(shù)console.log(Math.floor(Math.random()*71)+30)
Math.round() 四舍五入
Math.ceil() 進(jìn)一法
Math.floor() 去尾法
Math.max() 最大值
Math.min() 最小值
Math.sqrt() 平方
Math.pow() m的n次方
Math.sin() 對(duì)比斜,括號(hào)里面只能輸入弧度
Math.cos() 鄰比斜
Math.tan() 對(duì)比鄰
nub.toFixed(保留小位點(diǎn)后的數(shù)幾位)保留的位數(shù)之后的四舍五入
3.宿主對(duì)象
由ECMAScript實(shí)現(xiàn)的宿主環(huán)境提供的對(duì)象甥材,可以理解為:瀏覽器提供的對(duì)象盯另。所有的BOM和DOM都是宿主對(duì)象。
2.從數(shù)組[1,'a', 'd',12,56]刪除1,'a'洲赵?
let arr=[1,'a', 'd',12,56];
arr.splice(0,2);
console.log(arr);//["d", 12, 56]
console.log(0.1+0.2);
console.log('3'+4);
console.log('3'+'1');
console.log('5'-1);
console.log('3'+1);
console.log([]+{});
console.log([]==null);
console.log({} =={});
輸出什么鸳惯?原因?
console.log(0.1+0.2);
- 0.30000000000000004
- 浮點(diǎn)數(shù)值
console.log('3'+4);
- '34'
- 隱式轉(zhuǎn)換string,toString()
console.log('3'+'1');
- '31'
console.log('5'-1);
- 4
- 隱式轉(zhuǎn)換Number()
console.log('3'+1);
- 31
- 當(dāng)加號(hào)運(yùn)算符時(shí)叠萍,String和其他類型時(shí)芝发,其他類型都會(huì)轉(zhuǎn)為 String;其他情況苛谷,都轉(zhuǎn)化為Number類型 辅鲸, 注: undefined 轉(zhuǎn)化為Number是 為’NaN‘, 任何Number與NaN相加都為NaN抄腔。其他運(yùn)算符時(shí)瓢湃, 基本類型都轉(zhuǎn)換為 Number,String類型的帶有字符的比如: '1a' ,'a1' 轉(zhuǎn)化為 NaN 與undefined 一樣赫蛇。
console.log([]+{});
- "[object object]"
- ({}).valueOf().toString() -> "[object Object]"
([])..valueOf().toString() -> ""
"[object Object]"+ "" -> "[object object]"
console.log([]==null)
- false
- [] -> '' ''!==null ''!==undefined
console.log({} =={});
- false
- 對(duì)象存在堆區(qū)绵患,在棧區(qū)存著兩個(gè)對(duì)象的不同的指針,兩個(gè)指針不同
關(guān)于隱式轉(zhuǎn)換點(diǎn)擊具體查看文章
還有隱式轉(zhuǎn)換更多問題詳解
4.垃圾回收機(jī)制悟耘,管理內(nèi)存落蝙,如何優(yōu)化?
答案參考我另一篇文章
5.比較typeof和instanceof區(qū)別暂幼?
1.typeof能夠檢測(cè)出了null之外的基礎(chǔ)類型(String筏勒、Number、Boolean旺嬉、Undefined)管行。
對(duì)于引用類型能判斷出function、其他的都為Object邪媳。
2.instanceof是用來判斷 A 是否為 B 的實(shí)例捐顷。
表達(dá)式為:A instanceof B,如果 A 是 B 的實(shí)例雨效,則返回 true,否則返回 false迅涮。
在這里需要特別注意的是:instanceof 檢測(cè)的是原型。
instanceof 只能用來判斷兩個(gè)對(duì)象是否屬于實(shí)例關(guān)系徽龟, 而不能判斷一個(gè)對(duì)象實(shí)例具體屬于哪種類型叮姑。之后增加了Array.isArray()方法判斷這個(gè)值是不是數(shù)組的。
如[1,2] instanceof Array
function fun(n,o) {
console.log(o)
return {
fun:function(m){
return fun(m,n);
}
};
}
var a = fun(0); a.fun(1); a.fun(2); a.fun(3);//undefined,?,?,?
var b = fun(0).fun(1).fun(2).fun(3);//undefined,?,?,?
var c = fun(0).fun(1); c.fun(2); c.fun(3);//undefined,?,?,?
//問:三行a,b,c的輸出分別是什么据悔?
6,7,8題的具體答案點(diǎn)擊分析查看文章
a: undefined,0,0,0
b: undefined,0,1,2
c: undefined,0,1,1
var o={
fn:function (){
console.log(fn);
}
};
o.fn();
ERROR報(bào)錯(cuò)
8.var fn=function (){
console.log(fn);
};
fn();
function (){console.log(fn);};正確
使用var或是非對(duì)象內(nèi)部的函數(shù)表達(dá)式內(nèi)传透,可以訪問到存放當(dāng)前函數(shù)的變量耘沼;在對(duì)象內(nèi)部的不能訪問到。
因?yàn)楹瘮?shù)作用域鏈的問題朱盐,采用var的是在外部創(chuàng)建了一個(gè)fn變量耕拷,函數(shù)內(nèi)部當(dāng)然可以在內(nèi)部尋找不到fn后向上冊(cè)作用域查找fn;
而在創(chuàng)建對(duì)象內(nèi)部時(shí),因?yàn)闆]有在函數(shù)作用域內(nèi)創(chuàng)建fn托享,所以無法訪問骚烧。