Javascript知识汇总------js中容易被忽略的细节(持续更新)

  • in运算符

    语法:boolean       “name” in Object 判断对象是否具有某一个属性
var myObject = {name:'吴小碎'};
console.log('name' in myObject); //true   返回值为true表示myObject中存在name属性
console.log('age' in myObject); //false   返回值为false表示myObject中不存在name属性
  • new运算符 和 直接量(字面量)

var objONE = {};   //直接量(字面量)生成对象
var objTWO = new Object();   //new运算符生成对象
  • 引用类型 和 值类型

值类型赋值不会改变原始数据
引用类型在内存中是一个,值改变会改变以前的数据
var num1 = '13';
var num2 = num1;
num2 = '23';
console.log(num1)   //13   改变值num2的值num1并未改变,证明num1与num2在空间分别占有自己的内存,是两个独立的个体
console.log(num2)   //23   
console.log(num1 == num2);   //false  这里是值引用比较,故只比较值是否相同

var obj1 = {name:'吴小碎',age:18};
var obj2 = obj1;
obj2.sex = '男'
console.log(obj2);   // {name: "吴小碎", age: 18, sex: "男"}
console.log(obj1);   // {name: "吴小碎", age: 18, sex: "男"}  当增加obj2属性时,obj1随之改变
console.log(obj1 == obj2);   //true   引用类型公用一个内存,相当于obj2是obj1的桌面快捷方式,obj1和obj2指向同一内存路径
  • delete

  1. 删除数组中的一个元素
  2. 对象的属性或者方法
  3. 删除一个没有用var 的变量声明
var arr1 = [1,2,3,4]
delete arr1[0]
console.log(arr1);  // [empty, 2, 3, 4] 长度不变,只是删除其中的值

var obj = {name:'吴小碎',age:18};
delete obj.name
console.log(obj)   //{age: 18}   删掉键值对

var a1 = 'test';
delete a1;
console.log(a1); //test  变量a1还存在,a1未被删除

a2 = 'test';
delete a2;
console.log(a2)   //Uncaught ReferenceError: a2 is not defined  证明已经删除变量a2
  • 报错处理方法

  try{  可能出现错误的代码  } catch(e) {   e->接收的错误信息   }finally{   无论怎样都会最后执行   }
try {
    //可能出现错误的代码
    //1.
      obj.name;  //系统报错信息->obj is not defined
    //2.
    //throw new Error('我是错误信息');   //强行扔出报错信息  
} catch (error) {
    //如果出错执行  error->try抛出的错误信息
    console.log(error); //ReferenceError: a is not defined
} finally {
    //无论怎样都会最后执行
    console.log('最终执行我了吗?');   //最终执行我了吗?
}
  •  js执行: 预解析(函数,和var) , 一句一句执行

解析顺序:scirpt代码块  ->  解析执行环境  ->  var || function (function优先级高于var)
<script>
    console.log(msg);//与下方msg定义变量存在于两个代码块故:Uncaught ReferenceError: msg is not defined
</script>
<script>
    var msg = '吴小碎'
</script>

<script>
    console.log(msg);   //msg在上一个代码快解析完成,所以打印出:吴小碎
    console.log(msg1);  //与msg1存在与同一个代码块,解析执行环境存在在一个script代码块内所以:undefined
    var msg1 = '吴小碎'
</script>
  • 表达式

凡是将数据和运算符等联系起来有值的式子就是表达式
  • 语句

  表达式+分号

  • 对象的创建方法

  literal(字面量创建)

 var o1 = {name : 1, age : 20}

initializer非字面量创建

function Person (){
    this.name = 'jim'
}
Person.prototype.show = function (){console.log('我被执行了')}
var o2 = new Person();
//new 实现
Person.call(o2);//将属性添加至o2中
o2.__proto__ = Person.prototype; //将原型属性添加至o2中

var o3 = Object.create(null); //若参数为空则输出一个空对象,也不存在__proto__属性
var o3 = Object.create(Person); //将Person自身所有属性附加到o3的__proto__属性中也包括它的prototype属性
var o3 = Object.create(Person,{  //第一个参数作为o3对象的__proto__来使用,后面的对象当作o3属性使用
    size: {
        value: "large",
        enumerable: true //可列举的
    },
    shape: {
        value: "round",
        enumerable: true
    }
});

将伪数组转换成数组的方法

var args = Array.prototype.slice.call(arguments);
var args = [].slice.call(arguments, 0);