原生函數(shù)
常用的原生函數(shù)
String()
Number()
Boolean()
Array()
Object()
Function()
RegExp()
Date()
Error()
Symbol()
內(nèi)部屬性 [Class]
所有typeof 返回值為object 的對象都包含一個(gè)內(nèi)部屬性[Class],這個(gè)屬性無法直接訪問击敌,一般通過Object.prototype.toString(..) 來看擎勘。
例如:
Object.prototype.toString.call([1,2,3]);
// "[object Array]"
基本類型值
Object.prototype.toString.call(null);
// "[object Null]"
封裝對象包裝
由于基本類型值沒有.length 和 .toString() 這樣的屬性和方法。
封裝對象釋疑
想要自行封裝基本類型值拒担,可以使用Object(..)(不帶new 關(guān)鍵字)
var a = "abc";
var b = new String(a);
var c = Object(a);
一般不推薦直接使用封裝函數(shù)
拆封
封裝對象中的基本類型值鲤孵,可以使用valueOf() 函數(shù)兆旬。
var a = new String("abc");
var b = new Number(42);
var c = new Boolean(true);
a.valueOf(); // "abc"
b.valueOf(); // 42
c.valueOf(); // true
原生函數(shù)作為構(gòu)造函數(shù)
Array(..)
var a = new Array(1,2,3);
a; // [1,2,3]
var b = [1,2,3]
b; // [1,2,3]
構(gòu)造函數(shù)Array(..),不要求必須帶關(guān)鍵字new,不帶時(shí)他會自動(dòng)補(bǔ)上Array構(gòu)造函數(shù)只帶一個(gè)參數(shù)時(shí)候脖岛,該參數(shù)會被數(shù)組的預(yù)設(shè)長度而不是當(dāng)數(shù)組中的一個(gè)元素舍沙。
var a = new Array(3);
a.length; // 3
a;
總之永遠(yuǎn)不要?jiǎng)?chuàng)建和使用空單元數(shù)組
Object(..) , Function(..) , 和RegExp(..)
除非萬不得已近上,否則不要使用Object(..) / Function(..)/ RegExp(..)
Date(..) 和Error(..)
創(chuàng)建時(shí)間必須使用 new Date(),主要是用來獲取當(dāng)前的Unix 時(shí)間戳Date.new()然后通過日期對象中的getTime() 來獲得。
創(chuàng)建錯(cuò)誤對象(error objec) 主要是為了獲得當(dāng)前運(yùn)行的上下文拂铡。
Symbol(..)
基本數(shù)據(jù)類型——符號壹无。符號具有唯一性的特殊值,用它來命名屬性不容易導(dǎo)致重名感帅。
Symbol 的靜態(tài)屬性形式斗锭,Symbol.create, Symbol.iterator
obj[Sybol.iterator] = function() {/../}
使用 Symbol(..) 原生構(gòu)造函數(shù)來自定義符號,不能帶new 關(guān)鍵字失球,否則報(bào)錯(cuò)岖是。
var mysym = Symbol("my own symbol");
mysym; // Symbol(my own symbol)
mysym.toString(); // "Symbol(my own symbol)"
typeof mysym; // "symbol"
var a = { };
a[mysym] = "foobar";
Object.getOwnPropertySymbols(a);
// [Symbol(my own symbol)]
原型類型
原生構(gòu)造函數(shù)有自己的 .prototype對象 如: Array.prototype,
String.prototype.
String#indexOf(..)
在字符串中查找指定字符串的位置。
String#charAt(..)
獲得字符串指定位置上字符
String#substr(..),String#substring(..) 和String# slice(..)
獲取字符串的指定部分
String#toUpperCase() 和 String#toLowerCase()
將字符串轉(zhuǎn)換為大寫和小寫
String#trim()
去掉字符串前后的空格,返回新的字符串
強(qiáng)制類型轉(zhuǎn)換
值的類型轉(zhuǎn)換
將值從一種類型轉(zhuǎn)換為另一種類型轉(zhuǎn)換豺撑,這是顯示的情況烈疚,隱式的情況通常為強(qiáng)制類型轉(zhuǎn)換。
JavaScript 中的類型轉(zhuǎn)換總是是返回標(biāo)量基本類型前硫。
抽象值操作
ToString
抽象操作ToString 胞得,它負(fù)責(zé)處理非字符串到字符串的強(qiáng)制類型轉(zhuǎn)換數(shù)組的默認(rèn)toString() 方法經(jīng)過重新定義,將所有的單元字符串化以后在連接在一起屹电。
var a = [1,2,3];
a.toString(); // "1,2,3"
JSON字符串換阶剑,
JSON.stringify(..) 在對象中遇到undefined,function 和 symbol 時(shí)會自動(dòng)將其忽略,在數(shù)組中則會返回null危号。
例如:
JSON.stringify(undefined); // undefined
JSON.stringify(function(){}); // undefined
JSON.stringify(
[1,undefined,function(){},4]
); // "[1,null,null,4]"
JSON.stringify(
{a:2,b:function(){}}
); // "{"a":2}"
toJSON() 返回的應(yīng)該是一個(gè)適當(dāng)?shù)闹的脸睿梢允侨魏晤愋停缓笤儆蒍SON.stringify(..) 對齊進(jìn)行字符串化外莲。
ToNumber
有時(shí)候需要將非數(shù)字值當(dāng)做數(shù)字來使用猪半,比如數(shù)學(xué)運(yùn)算。
true 轉(zhuǎn)為 1偷线, false 轉(zhuǎn)換為 0 ,undefined 轉(zhuǎn)換為NaN
null 轉(zhuǎn)換為0
為了將值轉(zhuǎn)換為相應(yīng)的基本類型磨确,抽象操作ToPrimitive ,首先檢查該值是否有valueOf() 方法,如果有就用該值進(jìn)行強(qiáng)制類型轉(zhuǎn)換声邦。沒有就用toString()
的返回值來進(jìn)行強(qiáng)制類型轉(zhuǎn)換乏奥。如果valueOf() 和toString() 均不會返回值就會產(chǎn)生TypeError 錯(cuò)誤。
ToBoolean
假值:
值可以被分為以下兩類亥曹。
1.可以被強(qiáng)制類型轉(zhuǎn)換為false的值
2.其他(被輕質(zhì)類型轉(zhuǎn)換為true的值)
以下這些是假值
undefined
null
false
+0,-0和NaN
""
假值對象:瀏覽器在某些特定情況下邓了,在常規(guī)JavaScript語法基礎(chǔ)上創(chuàng)建了一些外來值,這些就是 “假值對象”
真值
真值就是假值列表以外的值
顯式強(qiáng)制類型轉(zhuǎn)換
字符串和數(shù)字之間的顯示轉(zhuǎn)換
字符串和數(shù)字之間顯示強(qiáng)制類型轉(zhuǎn)換是通過String(..) 和Number(..).
兩者之間的顯式強(qiáng)制類型轉(zhuǎn)換
var a = 42;
var b = String(a);
var c = "3.14";
var d = Number(c);
b; // "42"
d: // 3.14
還有其它方式實(shí)現(xiàn)字符串和數(shù)字之間的顯示轉(zhuǎn)換
var a = 42;
var b = a.toString();
var c = "3.14";
var d = +c;
b; // "42"
d: // 3.14
日期顯示轉(zhuǎn)換為數(shù)字
一元運(yùn)算符+ 的另一個(gè)常見的用途是將日期對象(Date)對象強(qiáng)制轉(zhuǎn)換為數(shù)字媳瞪。
var timestamp = +new Date();
顯式解析數(shù)字字符串
解析字符串中的數(shù)字和將字符串強(qiáng)制類型轉(zhuǎn)換為數(shù)字的返回結(jié)果都是數(shù)字骗炉。
例如:
var a = "42";
var b = "42px";
Number(a); // 42
parseInt(a); // 42
Number(b); // NaN
parseInt(b); // 42
解析允許字符串中含有非數(shù)字字符,解析按從左到右的順序蛇受,如果遇到非數(shù)字字符就停止句葵。
parseInt(..) 針對的是字符串,像parseInt(..) 傳遞數(shù)字和其他類型的參數(shù)是沒用的
顯示轉(zhuǎn)換為布爾值
ToBoolean 是顯式的ToBoolean 強(qiáng)制類型轉(zhuǎn)換:
var a = "0";
var b = [];
var c = {};
var d = "";
var e = 0;
var f = null;
var g;
Boolean(a); // true
Boolean(b); // true
Boolean(c); // true
Boolea(d); // false
Boolea(e); // false
Boolea(f); // false
Boolea(g); // false
一元運(yùn)算符龙巨!顯示地將值強(qiáng)制類型轉(zhuǎn)換為布爾值笼呆。
var a = "0";
var b = [];
var c = {};
var d = "";
var e = 0;
var f = null;
var g;
!!a; // true
!!b; // true
!!c; // true
!!d; // false
!!e; // false
!!f; // false
!!g; // false
隱式強(qiáng)制類型轉(zhuǎn)換
隱式地簡化
字符串和數(shù)字之間的隱式強(qiáng)制類型轉(zhuǎn)換
+運(yùn)算符既能用于數(shù)字加法,也能用于字符串拼接旨别。
var a = "42";
var b = "0";
var c= 42;
var d = 0;
a + b; // "42"
c + d; // 42
對象的 - 操作與 + 類似诗赌;
var a = [3];
var b = [1];
a - b ; // 2
布爾值到數(shù)字的隱式強(qiáng)制類型轉(zhuǎn)換
隱式強(qiáng)制類型轉(zhuǎn)換為布爾值
下面的情況會發(fā)生隱式強(qiáng)制類型轉(zhuǎn)換
1.if(..) 語句中的條件判斷表達(dá)式。
2.for(..;...;..)語句中的條件判斷表達(dá)式(第二個(gè))
3.while(..) 和do..while(..) 循環(huán)中的條件判斷表達(dá)式秸弛。
4.铭若? : 中的條件表達(dá)式
5.邏輯運(yùn)算符 || (邏輯或) 和 (邏輯與) 左邊的操作數(shù)(作為條件判斷表達(dá)式)
|| 和 &&
|| 和 && 運(yùn)算符 的返回值并不一定是布爾類型洪碳,而是兩個(gè)操作數(shù)其中的一個(gè)的值
var a = 42;
var b = "abc";
var c = null;
a || b; // 42
a && b; // "abc"
c || b; // "abc"
c&& b; // null
對于 || 來說 如果條件判斷結(jié)果為true 就返回第一個(gè)數(shù)的值,如果為false 就返回第二個(gè)操作數(shù)叼屠。
&& 則相反瞳腌。
下面是一個(gè)|| 十分常見的 || 用法。
function foo(a,b){
a = a || "hello";
b = b || "world";
console.log(a + " " + b );
}
foo(); // "hello world"
foo("yeah","yeah"); // "yeah yeah"
符號的強(qiáng)制類型轉(zhuǎn)換
寬松相等和嚴(yán)格相等
“== 允許在相等比較中進(jìn)行強(qiáng)制類型轉(zhuǎn)換镜雨, 而=== 不允許”
抽象相等
有幾個(gè)非常規(guī)的需要注意
NaN 不等于NaN
+0 等于-0
寬松不相等 != 就是==的相反嫂侍, !== 同理
字符串和數(shù)字之間的相等比較
1.如果Type(x) 是數(shù)字,Type(y)是字符串荚坞,則返回 x== ToNumber(y)
的結(jié)果挑宠。
2.如果Type(x) 是字符串,Type(y) 是數(shù)字颓影,則返回 ToNumber(x)== y 的結(jié)果各淀。
其他類型和布爾類型之間的相等比較
== 最容易出錯(cuò)的地方就是true 和 false 與其他類型之間的相等比較
var a = "42";
var b = true;
a == b; // false
1.如果Type(x) 是布爾類型,則返回ToNumber(x) == y 的結(jié)果
2.如果Type(y) 是布爾類型诡挂,則返回 x == ToNumber(y) 的結(jié)果
首先:
var x = true;
var y = "42";
x == y; // false
反過來
var x = "42";
var y = false;
x == y; // false
null 和undefined 之間的相等比較
null 和undefinded 之間的 == 也涉及隱士強(qiáng)制類型轉(zhuǎn)換碎浇。
1.如果 x 為 null ,y 為 undefined ,則結(jié)果為 true
2.如果x 為undefined, y 為 null, 則結(jié)果為 true
var a == null;
var b;
a == b; // true
a == null; // true
b == null; // true
a == false; // false
b == false; // false
a == "" ; // false
b == ""; // false
a == 0; // false
b == 0; // false
對象和非對象之間的相等比較
關(guān)于對象和(對象/函數(shù)/ 數(shù)組) 和標(biāo)量基本類型(字符串/數(shù)字/布爾值)之間的比較。
1.如果Type(x) 是字符串或數(shù)字璃俗,type(y)是對象奴璃,則返回 x == ToPrimitive(y) 的結(jié)果
2.如果Type(x) 是對象, Type(y)是字符串或數(shù)字城豁,則返回
ToPromitive(x) == y 的結(jié)果溺健。
var a = 42;
var b = [42];
a == b; // true
var a = "abc";
var b = Object(a); // new String(a) 一樣
a === b; // false
a == b; // true
a == b 結(jié)果為true,應(yīng)為b 通過ToPromitive 進(jìn)行強(qiáng)制類型轉(zhuǎn)換,并返回基本類型值 “abc”钮蛛,與 a 相等。
假值相等的比較
一下是常規(guī)和非常規(guī)的比較
"0" == null; // false
"0" == undefined; // false
"0" == false; // true -- 暈剖膳!
“0” == NaN; // false
"0" == 0; // true
"0" == ""; // false
false == null; // false
false == undefined; // false
false == NaN; // false
false == 0; // true -- 暈魏颓!
false == "" // true -- 暈!
false == [] // true -- 暈吱晒!
false == {} // false
"" == null; // false
"" == undefined; // false
"" == NaN; // false
"" == 0; // true -- 暈甸饱!
"" == []; // true -- 暈!
"" == {}; // false
0 == null; // false
0 == undefined; // false
0 == NaN; // false
0 == []; true -- 暈仑濒!
0 == {}; false
因?yàn)樗麄儗儆诩訇枴?br>
極端情況
[] == ![] // true
對布爾值進(jìn)行強(qiáng)制類型轉(zhuǎn)換 [] == ![] 變成 [] == false,
2 == [2]
"" == [null]; //true
42 == "43" // false
"foo" == 42; // false
"true" = '"" // false
42 == "42" // true
"foo" == ["foo"] // true
安全運(yùn)用隱式強(qiáng)制類型轉(zhuǎn)換
1.如果兩邊的值中有true 或者 false, 千萬不要使用 ==.
2.如果兩邊的之中有[],"" 或者 0 叹话,盡量千萬不要使用==.這時(shí)候最好使用 === 來避免強(qiáng)制類型的轉(zhuǎn)換。
抽象關(guān)系比較
雙方都是字符串比較
var a = ["42"];
var b = ["043"];
a < b; // false
a 和b 并沒有被準(zhǔn)換為數(shù)字墩瞳,因?yàn)門oPrimitive 返回的是字符串驼壶,
比較的是 "42 " 和 "043" 兩個(gè)字符串, 因?yàn)?0"在字母順序上小于
“4”喉酌,所以最后結(jié)果為 false.
同理
var a = [4,2];
var b = [0,4,3];
a < b; // false
a 被轉(zhuǎn)為 “4,2”热凹,b 轉(zhuǎn)為 “0,4,3” 同樣式按字母順序進(jìn)行比較的泵喘。
var a = {b: 42};
var b = {b:43};
a < b ; // false
a 是 [object Object], b也是 [object Object] 所以按著字母順序
a < b 不成立。
下面的例子
var a = {b: 42};
var b = {b:43};
a < b; // false
a == b; // false
a > b; // false
a <= b; // true
a >= b; // true