深拷贝:
function deepcopy(main,get){
for(var key in main){// 遍历 main的成员
if(main.hasOwnProperty(key)){// 只需要拷贝 main的实例成员
if(typeof main[key] == "object"){//发现是引用类型
get[key] = Array.isArray(main[key]) ? [] : {};//判断是数组还是对象
deepcopy(main[key],get[key]);//对该引用类型进行下一轮拷贝
}
else{
get[key] = main[key];//值类型直接拷贝,不会有数据共享问题
}
}
}
}
class语法,class继承:
class Animal{
constructor(name,age){
this.age = age;
this.name = name;
}
say(){
console.log(this.age,this.name);
}
static Ic(){
console.log(1);
}//静态成员添加方法 static
}
//继承
class Person extends Animal{
constructor(name,age){
super(name,age);
}
id = "#1";
sayhi(){
console.log(2);
}
}
arguments:
function add(){
var sum = 0;
for(var i = 0;i<arguments.length;i++){
sum += arguments[i];
}
return sum;
}
//arguments 是伪数组,无法用for in 循环遍历
console.log(add(1,2,3,4));
eval(): 自调用,可以将字符串解析成可运行的script语言,还可以用来做加减运算
toString():
var a = 100;
console.log(a.toString());
console.log((100).toString(2));
console.log((100).toString(8));
console.log((100).toString(16));
var arr = [1,2,3,4,"123"];
console.log(arr.__proto__);
Array.prototype = Object.prototype;//系统自带的构造函数对象的原型对象无法修改
console.log(arr.toString());//Array原型对象自带toString方法
console.log(Object.prototype.toString.call(arr));//所以借用
var arr2 = [1,2,3,4,5];
console.log(arr2.toString());
//解决 Array.isArray 的兼容问题
function isArray(arr){
if(Array.isArray){
return Array.isArray(arr);
}else{
if(Object.prototype.toString.call(arr) == "[object Array]"){
return true;
}
return false;
}
}
console.log(obj.propertyIsEnumerable("constructor"));//不能枚举父级的
检查类型的四种方法:
function Person(a){this.a = a};
var now = new Person(1);
var arr = [];
console.log(typeof now);
console.log(now.constructor);
console.log(now instanceof Person);
console.log(now.toString());
console.log(Object.prototype.toString.apply(arr));
作用域的安全问题:
function Person(age){
if(this == window){
return new Person(age);
}
if(this instanceof Person){
return new Person(age);
}
if(!new.target){
return new Person(age);
}
this.age = age;
}