继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

js深层用法

穆圣
关注TA
已关注
手记 11
粉丝 13
获赞 115

1.Js中的数据类型分为两类

第一类是基本数据类型

有 number string boolean undefined null

第二类是引用数据类型

有 array function object

js中对象的分类

第一类是

1.内置对象
2.宿主对象
3.自定义对象

所谓的宿主对象:

js中有两个运行环境,浏览器,服务器nodejs

js代码运行环境中提供的对象,就是宿主对象,
在浏览器端的js而言,宿主对象就是浏览器的对象,window,history ,Document,
不同厂家的浏览器提供的支持尅能也不一样

注意 所有的内置对象都是global对象的属性。

js对象加强,
对象是属性的无序结合,每个属性都存放一个原始值,对象或函数,换句华说对象中的属性可以存放基本数据类型,也可以存放引用数据类型的数据。
在js对象中只有 属性,其他什么都没有

三条定律的两条链,

三条定律

  1. 一切皆对象,(数组,函数,对象,变量)
如何判断一个数据是不是对象,

typeof
console.dir()

数据类型也可以当做对象

自动创建的包装类型对象只存在瞬间。
原因是每一个基本数据类型,都有一个包装对象,
数值型:NUmber
布尔型:Boolean
字符串:String

引用数据类型也是对象

引用数据类型分为下面三类
函数
数组
对象

函数是对象

如何判断函数是不是对象 可以通过 instanceof 的功能,查看数据是否为指定的类型,代码如下

function (){
    consloe.log(',,,,,')
}
consloe.log(f instanceof Object);
//true

如何判断数组是否为对象可以通过

一 ,可以使用
instanceof

二,如果是对象可以给它添加属性和方法

三,可以使用console.dir()来查看

2.对象由函数创建

3.对象是属性的无序结合。

两天链

作用域链,

原型链

数组中的方法:

1.基础的ES3,ES4 方法

1.concat 用来连接两个或多分数组,形成一个数组

let arr1 = [1,3,4]
let arr2 = [4,5,7]
//对原来的数组没有影响,
let newarr = arr1.concat(arr2)
consloe.log(newarr)
//

2.join把数组转成字符串
3.push 在数组最后推入一个元素,返回值是新数组的长度,
4.unshift 在驻足的最前面推入一个元素,
返回值是新数组的长度,
5.pop 删除数组的最后一个元素,返回值是被删除的元素,
6,shift删除数组的第一个元素,返回被删除的元素,
7.slice截取一段元素,返回值是新数组。
8.splice(索引,howmany)删除数组的元素
9.sort()排序,根据ASCII码进行排序

ES5中新增的方法

Array.isArray(判断一个数组是否为一个数组)

forEach 对数组的遍历

map 对数组进行遍历 并且对数组进行操作并返回新的数组,

filter按条件对原来的数组进行筛选并返回新的数组,
reduce 对数组中的元素进行累加

some

every

Es6中新增的语法在我的手记中有写,有兴趣的小伙伴可以看下

对象的遍历方法

对象使用for循环是没有办法遍历的

使用for in 进行对象 的遍历用法如下

格式为 for(let 变量 in 对象)
{
//对象[变量]
}

注意只能同过对象[变量]方式去访问

2,不能使用for循环去访问对象属性,它只适用于在数组中使用,原因是:数组的下标是有序的,而对象的二属性名是无序的

精细化设置对象的属性,格式

Object.defineProperty(对象名,属性名),{
configurable:是否删除
writable:是否可写
enmerable:能否被遍历
value:属性对应的值
}

jia var 的变量不能用delete删除的原因也是由于,var的变量默认的有一个特征,叫configuration:false

如何判断对象中是否具有某个属性

1.使用in 可以用来判断一个属性是否在对象当中
使用方法为(“属性名” in 对象)
2,使用hasownproperty 也能判断一个属性是否在一个对象中

使用方法为(对象.hasOwnProperty(‘s属性名’))

in 和 hasOwnProperty 主要的区别是in 除了找自己本身的属性还会去它自己的原型对象当中的属性,
hasOwnProperty只在自己属性中找

属性的分类主要有两类

一类是自有的另外一类是原型当中的属性

对象中的原型与原型链

原型proTotype

每一个函数都有一个名为prototype的属性,
属性值是一个对象,这个属性称为原型

隐式原型__proto__

对象是属性的结合,每个对象都有 一个名为__proto__的属性,这个属性也是一个对象,这个属性__proto__称为隐式原型

由于函数既是也是对象所以对于函数来说,它既有prototype 属性也有__proto__属性

原型与隐式原型的关系

对象的__proto__属性 ==创建这个对象的那构造器prototype属性
‘对象的隐式原型’ ==创建这个对象的构造器(函数)的原型

原型链

作用是 确定对象的属性

在我们去访问某个对象的属性时,如何去找到这个属性,找属性的过程就需要沿着原型链去找

寻找属性的过程是先在自身的属性中寻找,如果找不到则进入它的隐式原型中去找。
隐式原型也是个对象如果对象的__proto__中也找不到,则会去obj.proto.__proto__中接着去寻找,

直到找到__proto__为null停止。
这种查询对象中的属性的方式被称为原型链

三条定律

a,到处都有this
a.只要是能写js代码的地方,都可以访问this
b.this 的值随时都有可能发生改变,只有在调用的时候才能被确定
c.不能手动的修改this的值

四种情况

一般情况下this出现在函数的是内部,分为四种情况去讨论
1》函数不是某个对象的属性而是一个普通的函数
如果是一个普通的函数,那么this就代表的是window

2》函数是某个对象的方法
如果this出现在一个方法中那么this就代表这个方法所在的对象

3》如果在调用函数之前加一个new,它会创建并返回一个对象,而这个函数内部的this就指向这个对象

4》可以通过Function对象的apply和call去指定函数内部中的this指向

通过Object.prototype.toString 封装一个可以判断变量值得数据类型的函数

function gettype(cont){
    let str = Object.prototype.toString.call(cont);
    str = str.substr(8)
    let len = str.length;
    str = str.substr(0,len-1);
    str = str.toLowerCase()
    return str;
}

使用apply 与call 改变this指向问题的区别

apply 也是用来改变function中的this,它和call是完全一样的只是有一点不同:
它们的参数列表不同;

cll 用法: 函数.call(obj,参数1,参数2…)
apply用法: 函数.apply(obj,[参数1,参数2])

如果函数没有参数的话,f.apply,与f.call的用法是一样的

使用call进行字符串的反转

普通的反转是使用for循环进行字符串的遍历然后实现字符串的反转;

有了call之后可以借用数组中的reverse()方法实现字符串的反转。


var str = '1234567';
let rs = Array.prototype.reverse.call(str.split("")).join("")

console.log(rs)
//"7654321"

使用bind进行this绑定,

格式 var newf =f.bind(obj)

作用是将函数f中的this改成object对象 并返回一个新的函数

bind 与call的区别,
call 改变this 在执行函数
bind 改变this,不执行函数,返回一个绑定新this的函数

this的总结如下:

如果函数内部有this, 如何确定this的值;
如果一个方法前面有对象,this就指向这个对象。
如果一个函数没有说明是哪个对象的,那么在这个this肯定指向window
如果使用了call(),apply 那么this就指向这两个方法中的第一个参数;

对于创建一个对象的时候使用new 到底干了那些事情:

例如:

function F(){

}
var f = new f()

当我们使用new的时候

  1. 创建了一个对象 var f={}
    2.F.call(f) 将this 指向f
  2. of.proto = F.Prototype 使f具备原型对象上的方法
    4.return f
打开App,阅读手记
1人推荐
发表评论
随时随地看视频慕课网APP