外观
外观
耶温
1760字约6分钟
2024-05-11
最新的 ECMAScript 定义了 9 中数据类型 其中包括 6 中原始类型:Number,String,Boolean,undefined,Symbol,Bight 除此之外还有:null,Object,Function
可以使用typeof
来判断 6 种原始类型:
typeof 0; //number
typeof "wenbo"; //string
typeof true; //boolean
typeof undefined; //undefined
typeof Symbol(1); //symbol
typeof 1n; //bight
因为typeof
判断对象的类型为 Object,不会精确到哪种对象,会不准确。推荐使用Object.prototype.toString.call()
代替以上进行判断数据类型。
解构赋值语法是一种 Javascript 表达式。通过解构赋值, 可以将属性/值从对象/数组中取出,赋值给其他变量。
//数组
var [a, b] = [1, 2, 3];
console.log(a, b); // 1 2
var [c, , b] = [4, 5, 6];
console.log(c, b); // 4 6
var arr = [1, 2, 3];
console.log(...arr); // 1 2 3
console.log([...arr]); // [1,2,3]
var { name, skill } = {
name: "wenbo",
age: 18,
skill: "eat",
};
console.log(name, skill); //wenbo eat
//无声明复制 需要加小括号
var name, skill;
({ name, skill } = {
name: "wenbo",
age: 18,
skill: "eat",
});
console.log(name, skill); //wenbo eat
...
展开
...
语法,可以适用于迭代器对象
let arr = [1, 2, 3];
console.log(...arr); // 1 2 3
let [a, ...b] = [1, 2, 3];
console.log(a, b); // 1 [2,3]
let set = new Set([1, 2, 3]);
console.log(...set); // 1 2 3
var
:定义变量会挂载到window
上,变量会被提升let
:定义变量不会挂载到window
上,变量虽然会被提升,但是不允许访问,访问受限const
:与let
基本一致,但声明后的变量不允许再次赋值 Object.freeze()
可以冻结一个对象,对象不能再被修改,添加和删除let
和 const
定义变量时,在声明之前是不可以使用变量的,在语法上称为暂时性死区原型链继承 借用构造函数实现继承 组合继承 寄生式组合继承 class 实现继承
原型链继承
存在问题:原型中的引用对象会被所有的实例共享,子类在实例化的时候不能给父类构造函数传参
function Father() {
this.hobby = ["coding", "eat"];
}
Father.prototype.skill = function() {
console.log("i will javascript");
};
function Son() {}
Son.prototype = new Father();
var father = new Father();
var son = new Son();
var son1 = new Son();
console.log(father.hobby); //[ 'coding', 'eat' ]
father.hobby.push("play");
console.log(father.hobby, son.hobby, son1.hobby);
//[ 'coding', 'eat', 'play' ] [ 'coding', 'eat' ] [ 'coding', 'eat' ]
son.hobby.push("hei");
console.log(father.hobby, son.hobby, son1.hobby);
//[ 'coding', 'eat', 'play' ] [ 'coding', 'eat', 'hei' ] [ 'coding', 'eat', 'hei' ]
son.skill(); //i will javascript
借用构造函数继承
存在问题:方法需要定义在构造函数内,因此每次创建子类实例都会创建一边方法
function Father(name) {
this.name = name;
this.sayNmae = function() {
return this.name;
};
}
function Son(name) {
Father.call(this, name);
}
Son.prototype = new Father();
var father = new Father("wenbo");
var son = new Son("zhijian");
console.log(father.name, son.name); //wenbo zhijian
console.log(father.sayNmae(), son.sayNmae()); //wenbo zhijian
组合继承
Parent.call(this,)
继承父类的属性new Parent()
来继承父类的函数存在问题:组合继承会导致调用两次父类构造函数,存在内存上的浪费
function Father(name) {
this.name = name;
}
Father.prototype.sayName = function() {
return this.name;
};
function Son(name, age) {
Father.call(this, name);
this.age = age;
}
Son.prototype = new Father();
Son.prototype.constructor = Son;
var son = new Son("yewen", 18);
console.log(son); //Son { name: 'yewen', age: 18 }
console.log(son.sayName()); //yewen
Object.create(proto,[propertiesObject])
:创建一个新对象,使用现有的对象来提供新创建的对象的__proto__
proto
:新创建对象的原型对象propertiesObjec
:可选,需要传入一个对象 寄生组合继承解决组合继承会导致调用两次父类构造函数
function Father(name) {
this.name = name;
}
Father.prototype.sayName = function() {
return this.name;
};
function Son(name, age) {
Father.call(this, name);
this.age = age;
}
Son.prototype = Object.create(Father.prototype);
Son.prototype.constructor = Son;
var son = new Son("yewen", 18);
console.log(son); //Son { name: 'yewen', age: 18 }
console.log(son.sayName()); //yewen
class Father {
constructor(name) {
this.name = name;
}
getName() {
return this.name;
}
}
class Son extends Father {
constructor(name, age) {
super(name);
this.age = age;
}
getAge() {
return this.age;
}
}
var son = new Son("heihei", 18);
console.log(son); //Son { name: 'heihei', age: 18 }
console.log(son.getName(), son.getAge()); //heihei 18
实现一个Promise
1111
详情见 JavaScript 内置函数部分
详情见 JavaScript 深入理解部分
typeof
:判断一个变量的类型,可以利用
typeof
,来判断number
,bight
,string
,object
,boolean
,function
,undefined
,symbol
八种类型
注意:
typeof
只能判断object
数据类型为object
,不能具体到是哪一种object
typeof
不能判断null
,会把null
判定为object
console.log(typeof null); //object
instanceof
:object instanceof constructor
instanceof
运算符用来检测constructor.prototype
是否存在于参数object
的原型链上。
判定一个实例是否属于某种类型
判定一个实例是否是其父类型或者祖先类型的实例
function Person() {}
function Child() {}
Child.prototype = new Person();
var child = new Child();
var person = new Person();
console.log(person instanceof Person); //true
console.log(child instanceof Person); //true
instanceof
实现原理:
function new_instance_of(leftVaule, rightVaule) {
let rightProto = rightVaule.prototype; // 取右表达式的 prototype 值
leftVaule = leftVaule.__proto__; // 取左表达式的__proto__值
while (true) {
if (leftVaule === null) {
return false;
}
if (leftVaule === rightProto) {
return true;
}
leftVaule = leftVaule.__proto__;
}
}
Object.prototype.toString
Object.prototype.toString.call()
一个不错的判断方法,可以对一个变量的类型来进行比较准确的判断
Object.prototype.toString.call(1); // "[object Number]"
Object.prototype.toString.call("hi"); // "[object String]"
Object.prototype.toString.call({}); // "[object Object]"
Object.prototype.toString.call([]); // "[object Array]"
Object.prototype.toString.call(true); // "[object Boolean]"
Object.prototype.toString.call(() => {}); // "[object Function]"
Object.prototype.toString.call(null); // "[object Null]"
Object.prototype.toString.call(undefined); // "[object Undefined]"
Object.prototype.toString.call(Symbol(1)); // "[object Symbol]"