JavaScript常见知识点积累,包括数据类型、数值转换、对象、原型与原型链、作用域与闭包等等,持续整理更新,如有错误请指正,甚是感激
本文链接:JavaScript那些磨人的小妖精
作者:狐狸家的鱼
GitHub:八至
一共有七种数据类型,主要为两大类:原始类型、对象类型
number:用于任何类型的数字,包括整数或浮点数string:字符串boolean:逻辑类型,true和falsenull:未知的值undefined:未定义的值symbol:创建对象的唯一标识符(ES6新增)object:复杂的数据结构用来比较两个操作数的构造函数。
显示转换主要涉及三种转换:
ToPrimitive()ToNumber()ToString()内置类型的构造函数隐式转换
‘‘+10===‘10‘//true 将一个值加上空字符串可以转换为字符串类型+‘10‘ === 10//true 使用一元的加号操作符,把字符串转换为数字!!‘foo‘; // true !!‘‘; // false !!‘0‘; // true !!‘1‘; // true !!‘-1‘ // true !!{}; // true !!true; // true
+-*/)、指数(**)、余数(%)、自增(++)、自减(--)、数值、负数值>)、小于(<)、大于或等于(>=)、小于或等于(<=)、相等(==)、严格相等(===)、不相等(!=)、严格不相等(!==)!)、且(&&)、或(||)、三元(? :)Array对象允许存储键值化的集合,可以存储任何类型的元素
pop/push、shift/unshiftunshift:在数组首部添加一个元素shift:取出并返回第一个元素push:在末尾添加一个元素pop:取出并返回最后一个元素splice()/slice()arr.splice(index[], deleteCount, elem1, ..., elemN])
deleteCount 设置为 0,splice 方法就能够插入元素而不用删除 arr.slice(start, end)concat()arr.concat(arg1, arg2...)
sort()indexOf/lastIndexOf 和 includes
arr.indexOf(item, from) 从索引 from 查询 item,如果找到返回索引,否则返回 -1arr.lastIndexOf(item, from) 和上面相同,只是从尾部开始查询arr.includes(item, from) 从索引 from 查询 item,如果找到则返回 truefind 和 findIndex
let result = arr.find(function(item, index, array) { // 如果查询到返回 true });
item是元素index是它的索引array是数组本身返回true停止查询,返回item,没有查询到结果则返回undefined。
arr.findIndex与之一样,不过返回的是元素索引而不是元素本身。
filter()返回所有匹配元素组成的数组
let results = arr.filter(function(item, index, array) { // 在元素通过过滤器时返回 true });
map()迭代并返回数组中每个元素调用函数并返回符合结果的数组
let result = arr.map(function(item, index, array) { // 返回新值而不是当前元素 })
sort():数组排序reverse():颠倒数组,然后返回它forEach允许为数组的每个元素运行一个函数
arr.forEach(function(item, index, array) { // ... do something with item });
for(let i=0; i<arr.length; i++)for...of:不能获取当前元素的索引,只能访问 itemsfor...in(不推荐)forEachObject)getter和setter属性分为两种:数据属性和访问器属性。
当读取属性值时,用getter,当设置属性值时,使用setter。
obj.propertyobj["property]delete obj.propertykey in objfor(let key in obj)Object.assign或者_.cloneDeep(obj)prototype每个函数都有一个prototype属性,指向对象。
function foo() typeof foo.prototype; //Object
对于构造函数来说,生成实例的时候,该prototype属性会自动成为实例对象的原型
作用
对象的属性和方法定义在原型上,那么所有实例对象都能共享,节省内存。
function Person(name){ this.name = name; } person.prototype.sex = ‘male‘; let jack = new Person(‘jack‘); let mark = new Person(‘mark‘); jack.sex;//‘male‘ mark.sex;//‘male‘
构造函数Person的prototype属性,就是实例对象jack和mark的原型对象,它俩都共享了该属性。
原型对象的属性不是实例对象自身的属性。修改原型对象时,会体现在所有实例对象上,因为原型对象是共享的。
如果实例对象自身有某个属性或方法,实例对象不会取原型对象上获取。 如果
形成一个原型链:对象到原型,原型到原型...
prototype
Object.prototype,继承它的属性Obejct.prototype的原型是null,也就是没有自己的原型,原型链的尽头就是nullObject.getPrototypeOf(Object.prototype) // null
JavaScript 引擎先寻找对象本身的属性,如果找不到,就到它的原型去找,如果还是找不到,就到原型的原型去找。如果直到最顶层的Object.prototype还是找不到,则返回undefined。overriding)Object.create():j接受一个对象作为参数,然后以它的原型返回一个实例对象,完全继承原型对象的属性Object.setPrototypeOf:为参数对象设置原型,返回该参数对象。接受两次参数,第一个为现有对象,第二个为原型对象Object.getPrototypeOf:返回参数对象的原型Object.prototype.isPrototypeOf():判断该对象是否为参数对象的原型Object.prototype._proto_:返回该对象的原型。_proto_属性指向当前对象的原型对象,即构造函数的prototypr属性let Person = function(){}; let people = new Person(); Object.getPrototypeOf(people);//Person.prototype
obj的原型对象有三种方法:
obj._proto_obj.constructor.prototypeObjct.getPrototyprOf(obj)Object.getOwnPropertyNames:返回一个数组,元素是参数对象本身所有属性的键名Object.prototype.hasOwnProperty():返回布尔值,判断某个属性在对象自身还是在原型链上hasOwnPrototype属性(推荐用于遍历对象属性)hasOwnProperty 是 JavaScript 中唯一一个处理属性但是不查找原型链的函数constructor属性prototype对象有一个constructor属性,默认指向prototype对象所在的构造函数function Person(){}; Person.prototype.constructor;//Person
constructor属性定义在prototype对象上面,意味着可以被所有实例对象继承constructor属性instanceof运算符instanceof运算符只能用于对象,不适用原始类型的值undefined和null,instanceOf运算符总是返回falselet copyObj = origin => { return Obejct.create( Object.getPrototypeOf(origin), Obejct.getOwnPropertyDescriptors(origin) ); }
this关键字1.涵义
this在构造函数中,表示实例对象this就是属性或方法“当前”所在的对象this的指向是可变的,因为属性所在的当前对象可变this的实质就是在函数体内部,指代函数当前运行环境this指向全局环境obj环境执行,指向objfunction Person(){ return "我是" + this.name; } let jack = { name:"jack", resume:Person }; let mark = { name:"mark", resume:Person }; jack.resume();//"我是jack" mark.resume();//"我是mark"
2.使用场合
this,它指向的是顶层对象windowthis:当使用Function.prototype的call/apply方法时,函数内的ths·会被显示设置为函数调用的第一个参数3.绑定this的方法
call():可以指定函数内部this的指向(即函数执行时所在的作用域),函数在指定作用域中调用该函数,
null和undefined传入全局对象call方法let obj = {}; let person = function (){ return this; } person();//window person.call(obj);//obj
全局环境运行函数person时,this指向全局环境(window),call方法改变this指向对象obj
apply:与call类型,唯一不同就是它接收一个数组作为函数执行时的参数function.apply(thisValue, [...arr]);
第一个参数是this指向的对象,为null或undefined时,传入全局对象。
第二个参数是数组,其元素依次作为参数传入原函数。
bind():将函数体内的this绑定到某个对象,然后返回一个新函数let person = function(name, sex){ return "我叫" + name + "," + sex; } let obj = { name:"jack", sex:21 } let new = person.bind(obj); new();//我叫jack,21
4.this使用注意点
thisthisthisthis只有等到调用时才会有值this,在箭头函数内部访问的都是来自外部的this值原文:https://www.cnblogs.com/suRimn/p/10635800.html