前言:古人云,温故而知新,把自己学习js的进阶笔记整理一下,有错误之处还望指出,谢谢。
→点我去看js基础知识点整理
JavaScript进阶
1.typeof:
- 1.返回的是一个字符串;
- 2.只能判断简单数据类型,复杂数据类型用instanceof;
- 3.是一个关键字,不是一个函数,()的作用:提升优先级;
- 4.如果是一个函数,返回的是function,函数在js里是一等公民;
- 5.如果是null,返回的是object。
2.逻辑运算符:
逻辑中断:
&& : 找假值, 从左往右依次判断,如果某个操作数的逻辑是false,中断。
|| : 找真值, 从左右往右依次判断,如果某个操作的逻辑是true,中断。转换成布尔类型是false的几种情况:
null undefined 0 NaN "" false使用场景:
function animate(fn) { fn && fn(); //如果传参数函数就执行函数}animate();
3.比较运算符:
- == 的转换规则:
- NaN 不等于任何值 包括NaN本身
- null 不等于任何值, 除了null 和 undefined
- undefined不等于任何值, 除了undefined本身和null
- 如果两边有布尔类型, 两边都转换成数值类型比较 false:0 true:1
- 如果两边有数值类型, 两边都转换成数值类型。
- 如果两边没有数字和布尔类型,有字符串,都转换成字符串比较。
- 如果两边都是对象,比地址。
Number( [ 空数组 ] )为 0 ;Number( { 空对象 } )为 NAN。
4.严格模式:
- 开启严格模式:’’use strict’’
1.变量必须声明;
2.禁止this指向window对象;
3.禁用八进制。
5.数据类型:
- 简单数据类型:值类型,存储的是值本身;
- 复杂数据类型:引用类型,存储的是对象的地址,复制的地址,对象只有一个,两个变量指向同一个对象。
6.拷贝:
浅拷贝:将对象中所有的属性都依次赋值到新对象里面去。浅拷贝只复制了一层对象的属性
如果对象中的属性还有对象,那浅拷贝只能复制该对象的地址,所以复制后该属性的对象和原属性的对象是同一个。深拷贝:判断原对象的属性值的数据类型是否为对象
typeof obj[k] === 'object'
,
利用递归temp[k] = cloneObj(obj[k]);
实现。
7.对象:无序的键值对的集合。
面向过程:员工,一步一步考虑做事的过程;
面向对象:老板,让谁做什么事。
面向对象是面向过程的封装,而不是替代。面向对象的三大特性:
- 1.封装:
函数:封装一段代码。
对象: 把一些属性和函数封装到一个对象了。 - 2.继承:
拿来主义:一个对象没有这个属性或者方法,另一个对象有个这个属性或者方法,通过某些手段,能够直接用另一个对象的属性和方法。 - 3.[多态]:js中没有,只有强类型语言有。
- 1.封装:
创建对象的方式:
var obj = new Object();var obj={}; // 字面量创建;//工厂函数:每次调用,都会创建出来一个对象。function createPhone(brand) { var obj = { brand: brand } return obj;}// 缺点:创建出来的对象全是object类型,无法区分。/*构造函数:实例化对象 1. 首字母大写 2. 作用: 实例化对象(给this添加属性和方法) 3. 配合new关键字使用,如不配合new,this指向window*/function Phone(brand) { this.brand = brand;}// 缺点:内存浪费;改进:用原型'var hw = new Phone("华为");
- new关键字:
- 在内存开辟一块新的空间,创建一个空的对象
- 让构造函数的this指向这个新的对象
- 调用构造函数
- 返回新对象。
8.prototype:原型对象
- 所有的函数(构造函数)都会自带一个属性:prototype 这个属性是一个对象: 原型对象。
- 通过构造函数实例化的对象 可以直接访问prototype属性(原型对象)的属性和方法。
构造函数中相同的属性和方法可以放入其对应的原型对象中。
对象: 存储每个不一样值 (name, age , gender)
原型:存储所有对象共同的东西(方法)所有的函数都会有一个属性:prototype 指向其 原型对象
所有的对象都会有一个属性:_proto_ 指向当前对象的构造函数的 prototype 属性。
所有的原型对象都会有一个属性:constructor 指向当前 构造函数属性搜索原则:
如果自己有,用自己的,如果没有,找对象._proto_,如果还没有,一直往上找,知道Object.prototype,如果没有,undefined。
9.原型链:
一个对象会有一个原型(对象._proto_),同时这个原型也是一个对象,这个原型也会有原型,一环扣一环,就形成了一个链式的结构,我们把这个链式结构叫做;原型链。
对象可以使用原型上的东西,也可以使用原型的原型的东西,对象可以使用整个原型链上的东西。
1.var p = new Person();p-- > Person.prototype-- > Object.prototype-- > null2.var arr = [];arr-- > Array.prototype-- > Object.prototype-- > null3.var date = new Date();date-- > Date.prototype-- > Object.prototype-- > null4.var obj = {}obj-- > Object.prototype-- > null5. Math对象Math-- > Object.prototype-- > null
10.Object.prototype的成员:
obj.hasOwnProperty(prop) :判断prop属性是否是obj自己提供
in操作符:如果属性不是自己提供的,是从原型上继承来的,也会返回trueobj.propertyIsEnumerable(prop) : 判断prop是否是自己的属性, prop属性可否遍历
obj1.isPrototypeOf(obj2): 判断obj1是否在obj2原型链上。
toString(): Object.prototype.toString() [object type] 将对象转换成字符串
toLocaleString():跟本地化有关,
valueOf() : 将对象转换成简单类型(数值、布尔)
11.沙箱:匿名函数自调用
- 优点:不用担心全局变量污染的问题
缺点:完全与外界隔绝
对外暴露变量:传递window作为参数传入,window.变量=变量
12.继承:让一个对象可以使用另一个对象的属性和方法。
- 混入式继承:
function extend(obj1, obj2) { for (var k in obj2) { obj1[k] = obj2[k]; }}obj.extend({ sayHi: function() { console.log('hehe'); }})
- 原型式继承:
一个对象可以访问构造函数的原型中的属性和方法,那么如果想要让一个对象增加某些属性和方法,只需要把这些属性和方法放到原型对象中即可。
// 1.直接给原型增加属性和方法// 2.原型替换(注意:constructor)换老王Person.prototype = { constructor: Person, name: "zs", sayHi: function() {}}// 3.mixin+原型:不换原型,给原型混入Person.prototype.extend = function(obj) { for (var k in obj) { this[k] = obj[k];
注:本文内容来自互联网,旨在为开发者提供分享、交流的平台。如有涉及文章版权等事宜,请你联系站长进行处理。