1.语言基础
变量,类型,声明。
数组,对象,集合,hash
while if else switch do...while for forEach
< > <= + - | & || &&
JS的基础类型判断
JS有哪些内置数据类型?
7种
- number
- string
- boolean
- null
- undefined
- symbol
- object
number,string,boolean,null,undefined 为基本类型;
object 包含 function,array,date等。
如何做类型判断?
typeof
console.log(typeof 5)// number
console.log(typeof undefined)// undefined
console.log(typeof 'wzj')// string
console.log(typeof true)// boolean
console.log(typeof Symbol())//symbol
console.log(typeof {})// object
console.log(typeof null)// object
console.log(typeof [])// object
console.log(typeof (()=>{}))// function
console.log(typeof new Date())// object
总结:
- typeof 会把 null 判断成 object
- typeof 可以判断除了 null 以外的基本类型;
- typeof 对于非基本类型,只能判断出 symbol,function,其他都是object;
数组也会判断成object。
instanceof 判断
使用 a instanceof b 判断,实际上是看 a 的原型链上是否存在 b 的构造函数。
JS
function Person(name){
this.name = name;
}
const p = new Person('wzj');
console.log(p instanceof Person);//true
但是基本类型不能这样处理。console.log(10 instanceof Number) //false
console.log(new Number(10) instanceof Number)//true
手写实现一个instanceof
const myInstanceof = (left,Right) => {
if(typeof left !== 'object'){
return false
}
while(true){
if(left === null){
return false
}
if(Right.prototype === left._protp_){
return true
}
left = left._proto_;
}
}
Object.prototype.toString 判断,万能方法
JS
console.log(Object.prototype.toString.call(1)); //[object Number]
console.log(Object.prototype.toString.call('wzj')); //[object String]
console.log(Object.prototype.toString.call(undefined)); //[object undefined]
console.log(Object.prototype.toString.call(true)); //[object Boolean]
console.log(Object.prototype.toString.call({})); //[object Object]
console.log(Object.prototype.toString.call([])); //[object Array]
console.log(Object.prototype.toString.call(function(){})); //[object Function]
console.log(Object.prototype.toString.call(null)); //[object Null]
console.log(Object.prototype.toString.call(Symbol('wzj'))); //[object Symbol]
JS类型转换
为什么会有隐式转换, JS 本身是一种弱类型语言,我们不用提前声明好类型,程序运行时,类型会自动分配。
console.log(1 + 1);//2
console.log(1 + '1');// '11'
console.log(1 + undefined);// NaN
console.log(1 + null);//1
console.log(1 + true);//2
console.log(1 + false);//1
console.log(1 + '');//'1'
console.log(1 + []);// '1'
console.log(1 + 'wzj');// '1wzj'
总结:
- 当使用 + 运算符计算string和其他类型时,都会转换为 string 类型。(另外的值转成字符串)
- 除以上情况外,会转成number 类型,但是 undefined 会转成 NaN,结果也是 NaN
- 当 + 号两边存在NaN,则结果为NaN(not a number)
- Infinity + Infinity 为 Infinity ,Infinity + -Infinity 为NaN
- 如果 string 相加,直接拼接
- 如果 + 号两边,有一个是对象,则调用 valueof() 或 toString()
- 其他情况都会转换成 number类型
对象在进行转换基本类型时,会调用对象上的valueof() 或 toString() 方法,该方法的返回值为基本类型的结果。内置有一个函数 toPrimitive.
console.log(typeof NaN) // number
如何得到一个NaN
console.log(0/0) //NaN
console.log(Infinity + (-Infinity)) //NaN
console.log(Infinity -Infinity) //NaN
console.log(Infinity/ -Infinity) //NaN
console.log(Infinity + Infinity) //Infinity
网红题
can (a == 1 && a == 2 && a == 3) ever evalute to true ?
(a == 1 && a == 2 && a == 3)怎么能让以上为true?
答:
const a = {
value:1,
toString:function(){
return a.value ++
}
}
console.log((a==1 && a == 2 && a == 3)
另一种解法
let value = 0;
Object.defineProperty(global,'a',{
get:function(){
return ++value
}
})
JS的引用与拷贝
基本数据类型,保存在栈中(占用空间小,大小固定,频繁使用);
其他Array,Object,Function都是 引用数据类型(占用空间大,大小不固定 )
JavaScript是有基本数据类型与引用数据类型之分的。对于基本数据类型:number,string,Boolean,null,undefined它们在栈内存中直接存储变量与值。而Object对象的真正的数据是保存在堆内存,栈内只保存了对象的变量以及对应的堆的地址,所以操作Object其实就是直接操作了原数组对象本身。
Object.assign()
const foo = { a : 1}
const bar = { a: 10,b:20}
console.log(Object.assign({},bar,foo)) // {a:1,b:20}
特点:
1.值拷贝
2.返回值为第一个参数
3.浅层 merge