變量基本概念
- 變量
- var,let
- 變量名可以包括字母,_,開頭耳璧。
- 不可以用系統(tǒng)關(guān)鍵字和保留字命名拆宛。
- 原始值 存儲(chǔ)在棧內(nèi)存
- number
- string
- boolean
- undefinded
- null
- symbol(es6才有的)
- 引用類型, 存儲(chǔ)在堆內(nèi)存,通過引用
- object
- array
- function
類型轉(zhuǎn)換
- typeof 檢測(cè)類型
typeof(a)-----undefined;
//未經(jīng)聲明使用 a,唯一不報(bào)錯(cuò)的方式;
typeof(undefined)-----undefined;
typeof(NaN)-----number;
typeof(null)-----object;
- a instance of b
- 官方介紹:a對(duì)象是不是由b構(gòu)造函數(shù)構(gòu)造出來的。
- 判斷一個(gè)對(duì)象與構(gòu)造函數(shù)是否在一個(gè)原型鏈上
const Person = function() {}
const p1 = new Person()
p1 instanceof Person // true
var str = 'hello world'
str instanceof String // false
var str1 = new String('hello world')
str1 instanceof String // true
- 類型轉(zhuǎn)換
number(mix);
parseInt(String,radix);
parseFloat(String
String(mix);
toString(radix
Boolean;
- 轉(zhuǎn)boolean
除了以下睦裳,都會(huì)轉(zhuǎn)為真造锅,包括空數(shù)組,空對(duì)象
//false
//undefined
//null
//''
//NaN
//0
// -0
- 隱式轉(zhuǎn)換
isNaN();
//++/--/+/-
//---->Number()
//加減乘除廉邑;
//!哥蔚!轉(zhuǎn)為布爾值
其中一方為字符串,那么就會(huì)把另一方也轉(zhuǎn)換為字符串
如果一方不是字符串或者數(shù)字蛛蒙,那么會(huì)將它轉(zhuǎn)換為數(shù)字或者字符串
還需要注意這個(gè)表達(dá)式'a' + + 'b'
'a' + + 'b' // -> "aNaN"
因?yàn)?+ 'b' 等于 NaN糙箍,所以結(jié)果為 "aNaN",你可能也會(huì)在一些代碼中看到過 + '1' 的形式來快速獲取 number 類型牵祟。
- 隱式轉(zhuǎn)換題目
console.log(true +1);//2
var demo = false == 1;
console.log(demo);//false
if(typeof(a)&& -true + (+undefined) + "") {
console.log(會(huì)打印深夯,因?yàn)榍昂蠖际亲址?
}
//!!" " --------空格是true
//!!"" --------空串是false
100 +
問題
'100' + 100 // "100100"
100 + '100' // "100100"
100 + true // 101
100 + false // 100
100 + undefined //NaN
100 + null // 100
類型判斷函數(shù)
/**
* 類型判斷
1.判斷null
2.判斷基礎(chǔ)類型
3.判斷引用類型-原理是利用call指向引用類型,調(diào)用重寫后的toString 方法
*/
function getType(target) {
//先處理最特殊的Null
if(target === null) {
return 'null';
}
//判斷是不是基礎(chǔ)類型
const typeOfT = typeof target
if(typeOfT !== 'object') {
return typeOfT;
}
//肯定是引用類型了
//template函數(shù)用來轉(zhuǎn)換系統(tǒng)提示
const template = {
"[object Object]": "object",
"[object Array]" : "array",
"[object Function]": "function",
// 一些包裝類型
"[object String]": "object - string",
"[object Number]": "object - number",
"[object Boolean]": "object - boolean"
};
const typeStr = Object.prototype.toString.call(target);
return template[typeStr];
}
基本數(shù)據(jù)類型的toString 方法
- 基本類型是沒有屬性和方法的诺苹,但仍然可以使用對(duì)象才有的屬性方法咕晋。這時(shí)因?yàn)樵趯?duì)基本類型使用屬性方法的時(shí)候,后臺(tái)會(huì)隱式的創(chuàng)建這個(gè)基本類型的對(duì)象收奔,之后再銷毀這個(gè)對(duì)象
== 操作符
對(duì)于 == 來說掌呜,如果對(duì)比雙方的類型不一樣的話,就會(huì)進(jìn)行類型轉(zhuǎn)換
判斷流程:
- 首先會(huì)判斷兩者類型是否相同坪哄。相同的話就是比大小了
- 類型不相同的話质蕉,那么就會(huì)進(jìn)行類型轉(zhuǎn)換
- 會(huì)先判斷是否在對(duì)比 null 和 undefined势篡,是的話就會(huì)返回 true
- 判斷兩者類型是否為 string 和 number,是的話就會(huì)將字符串轉(zhuǎn)換為 number
1 == '1'
↓
1 == 1
- 判斷其中一方是否為 boolean模暗,是的話就會(huì)把 boolean 轉(zhuǎn)為 number 再進(jìn)行判斷
'1' == true
↓
'1' == 1
↓
1 == 1
- 判斷其中一方是否為 object 且另一方為 string禁悠、number 或者 symbol,是的話就會(huì)把 object 轉(zhuǎn)為原始類型再進(jìn)行判斷
'1' == { a: 'b' }
↓
'1' == '[object Object]'
- 兩邊都是對(duì)象的話汰蓉,那么只要不是同一對(duì)象的不同引用绷蹲,都為false
注意,只要出現(xiàn)NaN顾孽,就一定是false祝钢,因?yàn)榫瓦BNaN自己都不等于NaN
對(duì)于NaN,判斷的方法是使用全局函數(shù) isNaN()
=== 操作符
不轉(zhuǎn)類型若厚,直接判斷類型和值是否相同拦英。
但是 NaN === NaN 還是false
{} 等于true還是false
var a = {};
a == true // -> ?
a == false // -> ?
答案是兩個(gè)都為false
因?yàn)?a.toString() -> '[object Object]' -> NaN
1 與 Number(1)有什么區(qū)別
一個(gè)是變量,一個(gè)是函數(shù)
typeof 123 // "number"
typeof new Number(123) // "object"
123 instanceof Number // false
(new Number(123)) instanceof Number // true
123 === new Number(123) // false
區(qū)分對(duì)象的三種方式
- 1.instanceof
[] instanceof Array //---> true
2.constructor
[].__proto__.constructor //--->f Array(){}
3.指向重寫后的toString方法
Obje.prototype.toString.call(123);//object Number
Object.prototype.toString.call({});//object Object
Objectct.prototype.toString.call([]);//object Array
對(duì)象
- 方式1-字面量表示测秸,推薦使用
var a = {};
- 方式2-調(diào)用構(gòu)造函數(shù),不推薦使用
var obj = new Object();
- 方式3 疤估,自定義方法,形式和函數(shù)一樣,為了區(qū)分霎冯,構(gòu)造函數(shù)命名嚴(yán)格按照大駝峰形式(所有單詞首字母大寫)
function Person(){}
var person = new Person();