稳小情Javascript功能概念
稳小情学习整理的js笔记,希望对你们有帮助!
前端学习笔记
闭包
闭包的防范:闭包会导致多个执行函数共用一个共有变量,如果不是特殊需求,应尽量防止这种情况的发生。
闭包:当内部函数被保存到外部时,将会生成闭包。闭包会导致原有作用域不释放。造成内存泄露。
两个函数互相嵌套,把里面的函数保存到外面执行的时候,一定能够调用原来它在的那个函数环境里面的变量。
闭包的作用:
实现共有变量 eg:函数累加器
可以做缓存(存储结构) eg:eater
可以实现封装、属性私有化 eg:Person()
模块化开发,防止污染全局变量
立即执行函数
(function(){}) //执行一次销毁
//定义标准 (function({})) w3c 不太标准:(function(){})();
//只有表达式才能被执行
var dem = function(){
//和函数差不多执行完销毁
console.log("a");
}();
对象包装类
构造函数内部原理
1.在函数体最前面隐式的加上this={}
2.在执行this.xxx = xxx
3.隐式的返回this
function ste(name,k,z){
this.nane = "wenxiaoqing";
this.age = age;
}
var ste = new ste("zhangsan","18")
包装类
数字有正常的原始值数字,原始值数字不能有属性和方法,对象可以有。原始值是坚决不可能有属性和方法的。
New String(); New Boolean(); New Number();
原型,原型链(call/apply);
汉子比英文字母多一个字节。
原型定义:原型是function对象的一个属性,他定义了构造函数制造出的对象公共祖先。通过该构造函数产生的对象,可以继承该原型的属性和方法,原型也是对象。
利用原型特点和概念,可以提取共有属性。
对象如何查看原型→隐式属性 proto
对象如何查看对象的构造函数→constructor
构造函数有大驼峰式特点:每个单词首字母大写
//Person.prototype(原型),点的前面放的则是变量之类的。
//Person.prototype = {}; 是祖先。
//原型的增删改查
- //person.lastName = "a" //增加(但不是原型)
- //person(从控制台输入就是查看)
- //person.Prototype.name = "a";(改变原型)
- //delete person.name(删除)
var person{
name:name;
}
person.prototype = {
height:1400,
lang:4900,
carName:"BMW";
}
function car(){};
car.prototype={constructor:person};
//控制台查询已改为person(){}
原型链
原型链增删改查
//绝大多数对象的最终都会继承自Object.prototype
//Object.create(原型) 它也能创建对象
//person.prototype.name = "sunny";
//function person(){}
//var person = object.create(person.prototype);
控制台可正常计算的范围:小数点前十六位,后十六位。正常数+与-
call/apply
作用:改变this指向 call需要把实参按照行程的个数传进去
区别:后面传的参数形式不同 apply需要传一个arguments
//test() →test.call();
functiontest(){
}
继承模式、命名空间、对象枚举
继承发展史
传统形式→原型链
过多的继承了没用的属性
借用构造函数
不能继承借用构造函数的原型
每次构造函数都要多走一个函数
共享原型
不能随便改动自己的原型
圣杯模式
命名空间
管理变量,防止全局污染,适用于模块化开发。
属性表示方法
obj.prop 控制台输入
obj["prop"] 控制台输入
var obj = {name:"b"} 控制台:obj.name = "b".
控制台输入 obj["name"] 显示b
obj.name → obj["name"] 括号里面必须是字符串
对象的枚举
for in 1. hasOwnProperty 2. in 3. instanceof
遍历或者叫做枚举
// A instanceof B
看A对象的原型链上 有没有B的原型。
A对象是不是B构造函数构造出来的
this笔试真题讲解
1. 函数预编译过程this→window 2. 全局作用域this→window (this指向谁) 3. call/apply可以改变函数运行时this的指向 4. obj.fun() fun()里面this指向obj
arguments
arguments.calle(指向函数自身引用)
func.call
HTML小插曲
<meat content="xxxxx" name="keyuwords"></meat><!-关键字-> <meat content="xxxxx" name="description"></meat><!-描述-> <!-h1标签只能在网页中使用一次,有利于搜索引擎->
arguments.克隆
深度克隆需要连个参数
function deepclone(origin,target){}
判断是不是原始值(是的话直接拿过来)
判断是数组或对象
建立相应的数组或对象
三目运算符
数组
//数组的定义new Aarray(length/content);字面量 //数组的读和写 //arr[num] 不可以溢出读 //arr[num] xxx;可以溢出写
两种定义: var arr = []; var arr = newArray();
数组的常用方法
改变原数组
push,pop,shift,unshift,sort,reverse(逆转顺序)、splice
不可改变原数组
concat/join→split,toString,slice
arr.splice(从第几位开始截取多少的长度,在切口处添加新的数据)
arr.splice(3,0,4) 1,2,3,4,5
-1就是倒数第一位 数组里面可以有复数
arr.sort(排序)
必须写俩参数
看返回值
①当返回为负数时,那么前面的数字放在前面
②为正数,那么后面的数在前面
③为0,则不动
var arr = [1,6,4,8,3,2,10]; arr.sort(function(a,b)){ if(a>b){ return 1; }else{ //升序 return -1; } //降序就改成a<b; } var arrr = [1,2,3,4]; arrr.sort(function()){ return Math.random()-0.5; } //slice 从该位开始截取,截取到该位数组去重
一旦经历了var 的操作,所得出来的属性,(window),这种属性叫做不可配置的属性,不可配置的属性delete不掉。
var a = 1; //控制台: delete a ; 删不掉这个属性
或者下面这个靠谱一些 1. 预编译this→window 2. 谁调用的this指向谁 3. call apply 4. 全局this→window
每次想使用构造函数就需要new,构造对象
想通过构造函数构造对象的话,你就得new,不new生成不了对象。
例子:
function a(){} var a = new a(); new 加函数执行才会有这两步 var this= {}; return this; 下面是例子 隐式的 两步 function a(){ var this = {} this.name = '2'; return this }而正常执行a的话,他只会走预编译,new也会走预编译
不加new的时候,直接写a()的时候,她不会有var this 与return


















































































