js学习注意知识

通过构造函数创建对象,在构造函数内部先创造一个空对象,再通过传入的参数赋值,这个对象的原型会指向函数的prototype属性。最后把这个函数内部的对象返回给要实例化的对象。

‘=’赋值操作仅仅赋的是指针,如 a.prototype = b.prototype ,它们指向的是同一个对象,当改变a.prototype的属性的时候b.prototype的属性也会跟着改变。但当a.prototype = {}一个新对象时,改变的是a.prototype的指向,原来的prototype对象仍存在,所以在修改之前的子类仍能访问到原来的a.prototype,但新继承或新new的对象和函数的原型就指向新的a.prototype
(若修改 obj.prototype = {}(新对象),已经实例化的对象的原型不会被改变,新new的会继承新的prototype;)

方法:判断obj的原型是否为 Object.prototype Object.getPrototypeOf(obj) === Object.prototype;
不是所有的对象都继承Object.prototype 如 obj = Object.create(null);
var a = obj.bind(null)没有a.prototype属性;
函数原型存在于函数的prototype之中所以用getPrototypeOf获得函数的原型()中要函数的prototype 即Object.getPrototypeOf(obj.prototype);

instanceof 判断机制,判断右边的prototype属性是否出现在左边的原型链上;也就规定了右边必须是函数,函数才有prototype属性,左边一般是对象,若是原始类型就会返回false

Object.create({});创建的是空对象加个空对象的原型指向的prototype;(ES5的新方法)
模拟:

if(!Object.create){
    Object.create = function(proto){
        function F(){}
        F.prototype = proto;
        return new F;
    };
}

这样也能返回一个空对象加一个空对象的原型指向的prototype属性;

函数声明会被前置,函数表达式变量声明会被前置
Function构造器能拿到全局变量,但拿不到外层的局部变量(估计是Function在原型链上仅继承于Object.prototype~_~!)

作为对象方法的话,函数里的this指向对象本身。原型链上的this也会指向当前对象。函数构造器中的this,若直接调用this指向window,若用new构造对象,this会指向一个空函数,并且空函数的proto会指向函数的prototype属性,最后this会作为返回值。
用new构造对象,若构造函数return的是基本类型,则实际返回this指向的对象,若return的是对象,就返回该对象;

bind方法作用:绑定this;科里化;
bind 方法或函数绑定对象赋值给一个新的函数或方法名;
var a = b.bind({});
bind后的函数,也就是a仍然是一个函数,若再new a(),新new的对象 bind就会被忽略;
bind的第二个参数可以绑定参数;

在for循环内的回调函数不能立即获得i的值,因为是for初始化之后才执行的,只有回调函数添加一个立即执行的匿名函数并传递i才能使回调函数获取每次i的值,这样回调函数获取的就是闭包环境里的i;

get/set方法,在对象中直接设置不能用冒号,可以get/set 函数名([参数]) {函数体} ,调用就直接 对象.函数名,set则返回右边等号的值作为参数
若作为属性标签定义,则get/set:function([参数]){},一个属性可以同时设置get、set

对象属性名也要按规则取名
obj[“”]要加引号,不然只有数字和变量和对象才能使用,字母不能使用

for in遍历的是数组下标,forEach遍历传递的参数依次是:值,下标,函数,filter传的是值,下标

JavaScript的函数在查找变量时从自身函数定义开始,从“内”向“外”查找。如果内部函数定义了与外部函数重名的变量,则内部函数的变量将“屏蔽”外部函数的变量。

减少冲突的一个方法是把自己的所有变量和函数全部绑定到一个全局变量中

ES6:let申明一个块级作用域的变量
ES6:const定义常量,const与let都具有块级作用域

在对象方法内部定义函数的this指向window,修复方法:在方法内加that = this,内部函数调用that
要保证this的指向正确,必须obj.xxx调用

{}.toString() 返回[object Object] function.toString()返回函数代码

forEach,数组遍历,只能操作,不能return;

Number类型的toString方法才有基模式,参数表示以什么形式输出;
只有parseInt/parseFloat String和Number类型的时候才有效,否则返回NaN,基模式下的参数表示当前要转换的字符串的类型,最终都转换成十进制的数字

isNaN(“”) //false;
parseInt/parseFloat(“”) //NaN;

Number(null) //0;
null == 0 //false

用isNaN判断是不是数字时要除去 “” null Boolean 的情况,因为它们都能被隐式转换为数字 “”用===
汉字的第一个unicode\u4e00 最后最后一个\u9fa5

理解闭包:
闭包是函数内的函数包含子函数对父函数变量的引用,当运行父函数并把父函数返回的子函数赋值给一个更上层作用域的变量,在这个作用域存在期间,只要该变量还存在并且没被修改,这个闭包就一直存在。

function a(){
    var x = 0;
    var b = function(){
        x+=1;
        return x;
    }
    return b;
}
var c = a();

因为函数b引用了函数a的变量,函数a的被引用的作用域被绑定在函数b上,函数b被返回给变量c,只要当变量c的作用域一直存在,函数b与引用函数a的活动对象组成的闭包就一直存在,

当子函数对父函数的变量进行引用时,当时父函数的被引用的变量是什么状态就会一直保持什么状态,除非子函数改变了它;

词法作用域:当代码写出的时候,作用域就确定,写在哪的作用域就在哪,不以代码的运行为转移;

关联数组(hash数组)length无效

关联数组:
var a = [];
a[“key1”] = value1;

var b = {“key1”:value1,”key2”:value2}

在if中 0,”“,null,undefined,NaN会转为false;

11个内置对象,ES标准中规定的由厂商实现的对象

String Number Boolean
Array Date Math RegExp
Error
Function Object
Global(window)
js种 6种 错误对象:
SyntaxError: 语法错误
ReferenceError: 引用错误
TypeError: 类型错误,错误的使用了类型或类型的方法
RangeError: 范围错误,特指函数的参数范围!
EvalError: 调用eval函数时发生的调用错误
URLError: URL错误

转义字符:当字符串与程序的特殊符号冲突时,要用转义字符

NodeList和HTMLcollection是实时的,在迭代它们的时候还要删除其中的元素,那就在迭代开始前生成一个静态副本;在迭代设置条件用到NodeList和HTMLcollection的length时不应该直接使用,这会在每次迭代时都会遍历DOM树,重新生成NodeList和HTMLcollection,所以for(var i=0,len=nodeList.length;i

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值