一 JS中有哪些數據類型? -- 共 6 種數據類型,其中 5 種基本數據類型Undefined,Null,Boolean,Number和 String,1 種複雜數據類型Object。因為ECMAScript不支持創建任何自定義的類型,所以最終所有的類型都是其中 6 種數據類型之一。(ES6中新增 ...
一 JS中有哪些數據類型?
-- 共 6 種數據類型,其中 5 種基本數據類型Undefined,Null,Boolean,Number和 String,1 種複雜數據類型Object。因為ECMAScript不支持創建任何自定義的類型,所以最終所有的類型都是其中 6 種數據類型之一。(ES6中新增了第七種數據類型Symbol)
1-1 原始類型/值類型(傳遞值):Number,String,Boolean + 合成類型/引用類型(傳遞指針):Object + 特殊類型:Undefined,Null
1-2 object:狹義對象-object + 數組-array + 函數-function
二 JS如何識別值的類型?
-- 3種方法:typeof,instanceof,Object.prototype.toString
2-1 typeof(檢測基本數據類型)返回number,string,boolean,function,undefined + 其餘的都是object(array,null,object,window,等等)
2-1eg:
<body>
<p id = "demo"></p>
<script>
document.getElementById("demo").innerHTML =
typeof 1 + "<br>" + //number
typeof NaN + "<br>" + //number
typeof "hello" + "<br>" + //string
typeof false + "<br>" + //boolean
typeof function () {} + "<br>" + //function
typeof myCar + "<br>" + //undefined
typeof [1,2,3] + "<br>" + //object
typeof {name:'fermin', age:22} + "<br>" + //object
typeof new Date() + "<br>" + //object
typeof null; //object
</script>
</body>
2-1-1 用typeof獲取變數是否存在, if(typeof a!="undefined"){}
2-2 incetanceof(檢測引用數據類型,非引用數據返回false)對應的引用類型數據返回true
2-2eg:
<body>
<p id = "demo"></p>
<script>
var reg = new RegExp;
document.getElementById("demo").innerHTML =
({} instanceof Array) + "<br>" + //false
([] instanceof Array) + "<br>" + //true
(reg instanceof RegExp) + "<br>" + //true
("hello" instanceof String); //false 非引用數據都返回false
</script>
</body>
2-3 Object.prototype.toString精確判斷對象的類型
2-3eg:
<body>
<p id = "demo"></p>
<script>
document.getElementById("demo").innerHTML =
Object.prototype.toString.call(123) + "<br>" + //[object Number]
Object.prototype.toString.call('123') + "<br>" + //[object String]
Object.prototype.toString.call(true) + "<br>" + //[object Boolean]
Object.prototype.toString.call(undefined) + "<br>" + //[object Undefined]
Object.prototype.toString.call({}) + "<br>" + //[object Object]
Object.prototype.toString.call([]) + "<br>" + //[object Array]
Object.prototype.toString.call(function () {}); //[object Function]
</script>
</body>
三 JS的類型轉換
-- JavaScript 變數可以轉換為新變數或其他數據類型,有兩種類型轉換方式,強制(顯示)類型轉換(String(), toString(), Number(), parseInt(string,radix), parseFloat(string), Boolean() )和自動(隱式)類型轉換(isNaN(),一元操作符,算術運算符,邏輯運算符,比較運算符,if語句)
3-1 JS的強制類型轉換
3-1-1 強制轉換為數值類型:Number(),parseInt(string,radix),parseFloat(string)
轉換規則
(1)Number()轉換規則,整體轉換字元串類型
(a)數值:轉換為十進位數
(b)字元串:空字元串 -> 0 只包含數字/有效浮點格式 -> 十進位/浮點格式,忽略前導0,其餘轉成NaN
(c)布爾值:true-> 1 false-> 0
(d)undefined:轉成NaN
(e)對象:會調用自身valueOf(),返回原始類型值後用上述方法,否則再調用toString。若返回了原始類型再用上述轉換規則,否則系統報錯
(f)null: 轉成0
(1)eg
<body>
<p id = "demo"></p>
<script>
document.getElementById("demo").innerHTML =
Number(011) + "<br>" + // 9 識別了前導0轉換成八進位
Number('011') + "<br>" + // 11
Number('0') + "<br>" + // 0
Number('1a') + "<br>" + // NaN
Number('') + "<br>" + // 0
Number(true) + "<br>" + // 1
Number(undefined) + "<br>" + // NaN
Number({}) + "<br>" + //NaN
Number(null) + "<br>" + // 0
Number([]) + "<br>" + // 0
Number(function () {}); // NaN
</script>
</body>
(2)Number()與parseInt(string,radix),parseFloat(string)的轉換規則異同
Number整體轉換字元串類型,parseInt和parseFloat逐個解析字元,只把數字轉換出來,其餘都轉換為NaN
(2)eg:
<body>
<p id = "demo"></p>
<script>
document.getElementById("demo").innerHTML =
parseInt(011) + "<br>" + // 9
parseInt('01') + "<br>" + // 01
parseInt('1a') + "<br>" + // 1
parseInt('1a2b') + "<br>" + // 1
parseInt('') + "<br>" + // NaN 與Number不同
parseInt(true) + "<br>" + // NaN 與Number不同
parseInt(undefined) + "<br>" + // NaN
parseInt({}) + "<br>" + //NaN
parseInt(null) + "<br>" + // NaN
parseInt([]) + "<br>" + // NaN
parseInt(function () {}); // NaN
</script>
</body>
3-1-2 強制轉換為字元串類型:String()
轉換規則
(1)String()轉換規則,任意類型轉化成字元串
(a)布爾,undefined,null都是兩邊加""轉化為字元串,數值會轉換成十進位數再加""轉換為字元串,而字元串本身不變
(b)對象調用toString(),若返回原始類型值,再使用String()轉換,否則再調用valueOf(),若返回原始類型,再使用String()轉換,在否報錯
(1)eg:
<body>
<p id = "demo"></p>
<script>
document.getElementById("demo").innerHTML =
String(011) + "<br>" + // "9"
String('011') + "<br>" + // "011"
String(true) + "<br>" + // "true"
String(undefined) + "<br>" + // "undefined"
String({}) + "<br>" + //"[object Object]"
String(null) + "<br>" + // "null"
String([]) + "<br>" + // ""
String(function () {}); // "function () {}"
</script>
</body>
3-1-2 強制轉換為字元串類型:Boolean()
轉換規則
(1)Boolean()轉換規則,任意類型轉化成布爾值
undefined,null,-0,+0,NaN,""(空字元串)這六個值轉換為false,其它的都轉換為ture,註意對象(new Boolean(false))轉換後對應的也是true
(1)eg:
<body>
<p id = "demo"></p>
<script>
document.getElementById("demo").innerHTML =
Boolean(011) + "<br>" + // true
Boolean('011') + "<br>" + // true
Boolean(false) + "<br>" + // false
Boolean(new Boolean(false)) + "<br>" + // true
Boolean(undefined) + "<br>" + // false
Boolean({}) + "<br>" + //true
Boolean(null) + "<br>" + // false
Boolean([]) + "<br>" + // true
Boolean(function () {}); // true
</script>
</body>
3-2 JS的自動類型轉換
3-2-1 js何時自動轉換
(a)不同類型數據互相運算,多個非數值相加時,將非字元串自動強制轉換為字元串,再相加成字元串,其餘自動強制轉換為十進位數值再運算
(b)非布爾值類型數據求布爾值,如if中的條件,自動強制轉換為布爾類型
(c)非數值類型數據用一元運算符("+"和"-"),自動強制轉換為十進位類型
(d)使用相等或不相等操作符時,會自動強制轉換操作數,再比較他們的相等性。將非整數類型自動強制轉換為整數類型,但是undefined和null不改變,
且undefined==null返回true,NaN==NaN返回false
3-2-2 自動轉換為數值Number類型
eg:
<body>
<p id = "demo"></p>
<script>
document.getElementById("demo").innerHTML =
("2" - "1") + "<br>" + // 1
("2" + "1")+ "<br>" + // 21
(true + 1) + "<br>" + // 2
("1" * []) + "<br>" + // 0
("a" - 1 ) + "<br>" + // NaN
(+"a") + "<br>" + // NaN
(+false) + "<br>"; // 0
</script>
</body>
3-2-3 自動轉換為字元串String類型
eg:
<body>
<p id = "demo"></p>
<script>
document.getElementById("