什么是js? js是一门脚本语言, 解释性语言 弱类型语言 动态型的语言 基于对象的语言
js是怎么实现的呢?
ECMAscript :规定的是 核心语法
DOM: 文档对象模型 规定的是:如喝操作网页
BOM:浏览器对象模型: 规定的是:如何操作浏览器
创建对象的三种方式
1.字面量方式
var cc = {
name :"于谦"
sihai:function(){
console.log("你还")
}
}
2. 系统构造函数
var cc = new Object();
cc.name="张三";
cc.say=function(){
console.log("你好")
}
3.自定义构造函数
function Aa (name ){
this.name = name;
this.eat = function (){
console.log("你好")
}
}
New关键字的四个作用?
1.开辟内存空渐渐
2.给属性添加属性值
3.把对象指向this
4.返回this这个对象并把地址给了对象
工厂模式创建对象和自定义构造函数创建对象有什么异同点?
相同点:都可以创建对象,都有参数 都是函数
自定义构造函数特点:
1.函数名首字母大写
2.没有new
3.没有返回值
4.this指向当前对象
5.需要new才能创建对象
工厂模式创建对象特点:
1.函数名使用小驼峰命名法
2.有new
3.有返回值
4.返回的就是当前对象
5.不需要new直接调用方法 就能创建对象
狗咱函数和实例对象之间的关系?
1.实例对象是通过构造函数创建的 --创建的过程称为实例化
2.实例对象的原型的构造函数指向自己的构造函数
如何判断某对象是不是哪个数据类型?
1.对象.__proto__.constructor == 构造函数
2.对象 instanceof 构造函数
什么是原型?
实例对象中有一个属性: __proto__ 叫原型 也是一个对象 这个属性是给浏览器用的
构造函数中有一个属性: prototype 叫原型 也是一个对象 这个属性是给开发者用的
构造函数,实例对象和原型对象之间的关系?
当构造函数创建出来以后,就会产生protype原型对象,实例对象的__proto__和构造函数的原型对象相等
原型的作用?
共享数据 节省内存
如何把局部变量变成全局变量?
把函数内部的变量赋值给window
什么是原型链?
1.原型链指的是 原型和实例对象之间的关系
2.实例对象的__proto__指向自己的构造函数的原型
什么是继承?
js中的继承主要讲的是 构造函数与构造函数之间的关系
继承有哪几种方式?
1.借用构造函数继承
在需要继承的构造函数中使用 被继承函数名.call(this,参数)
注意:该继承的参数一定要添加在形参上
2.拷贝继承
遍历对象 然后把便利出来的每一项都添加在新数组里
3.原型继承
在需要继承的构造函数 的原型方法前 构造函数名.protype=new 被继承函数名()
4.混合继承
借用构造函数和原型继承的混合使用
继承的作用?
节省内存 共享数据
函数声明和函数表达式有两点区别?
1.函数声明在 if else 中 表现在ie10及以下 会直接去else 不去正确的
2.函数表达式 会发生变量的提升 函数声明肯定不会 因为压根就没有变量 注意:要先声明 后调用
call和apply 直接有什么异同点?
都是用来调用函数,而且是立即调用
如果第一个参数指定了 `null` 或者 `undefined` 则内部 this 指向 window
但是可以在调用函数的同时,通过第一个参数指定函数内部 `this` 的指向
call 调用的时候,参数必须以参数列表的形式进行传递,也就是以逗号分隔的方式依次传递即可
apply 调用的时候,参数必须是一个数组,然后在执行的时候,会将数组内部的元素一个一个拿出来,与形参一一对应进行传递
函数有几个成员?
1.name 代表函数名
2.lenght 代表形参个数
3.arguments 代表实参个数
4.caller 代表调用者
函数作为返回值或者函数作为参数?
函数作为返回值 和 函数作为参数都属于回调函数,说明实参和返回值的数据都需要进行处理
什么式预解析?
全局作用域
只要变量或函数定义在script标签 里 或函数外 那么一定是全局变量或者全局函数 对应有全局作用域
局部作用域
在js中 局部作用域只有函数才能有 除此以外都没有
块级作用域
在js中 在现阶段没有块级作用域 其实在现在来讲是可以创建块级作用域的
用let来定义变量 就可以创建 块级作用域
用一对大括号包起来的代码 外面是不能访问的(ES5)
什么是作用域?
就是在浏览器解析代码之前,把变量的声明和函数的声明提升到该作用域的最上面
如果是变量 那么把变量的声明提升到该变量作用域的最前面
如果是函数 那么把函数的声明提升到该函数作用域的最前面
如果函数和变量同名 优先提升函数
什么是闭包?
闭包就是能够读取其他函数内部 变量的函数
由于在js语言中,只有函数内部的子函数才能读取局部变量。因此可以把闭包简单的理解成定义在一个函数内部的函数
所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁
闭包的优缺点及作用?
闭包的作用: 缓存数据, 延长作用域
闭包的优点和缺点: 缓存数据(有缓存 把数据存下来 可以继续用 但是如果你一直不释放这个数据 最终内存会爆掉)
闭包有哪几种模式?
第一种是函数模式
第二种是对象模式
什么是沙箱?
沙箱:黑盒 小环境在这个环境中做任何事情与外界无关
什么是递归?
函数中调用自己此时就形成了递归 ,递归一定要用结束条件
白话:一个人从楼顶往下一层一层的走 ,每一层有一个硬币,知直到他走到了一楼然后从一楼把硬币(好比数据)从下往上一层一层的去捡
什么是浅拷贝
直接让 两个对象指向同一个地址
// 什么是深拷贝?
拷贝还是复制, 把一个对象中所有的属性或方法, 一个个的找到,并且在另一个对象中开辟相应的空间,一个个的村到另一个对象中
正则表达式相关概念:
什么是正则表达式
所谓的正则表达式:是用于匹配规律规则的表达式,正则表达式最初是科学家对人类神经系统的工作原理的早期研究,现在在编程语言中有广泛的应用。正则表通常被用来检索、替换那些符合某个模式(规则)的文本
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合、组成一个"规则字符串",这个挥着字符串用来表达对字符串的一种过滤逻辑
正则表达式的作用
1.给定的字符串是否符合正则表达式的过滤逻辑 就是匹配
2.可以通过正则表达式,从字符串中获取我们想要的特定部分(提取)
3.强大的字符串替换能力(替换)
正则表达式的特点
1.灵活性 逻辑性和功能性非常的强
2.可以迅速地用极简单的方式达到字符串的复杂控制
3.对于刚接触的人来说,比较晦涩难懂
正则表达式的组成
由元字符(特殊字符)和限定字符组成
创建正则表达式的两种方法?
1.字面量方式
格式: var 变量 = /正则语法/
2.正则表达式构造函数
格式: var 变量 = new 函数名(/正则语法/)
正则表达式基础语法:
. 表示的是: 除了\n以外额任意一个字符 "adfa14321432"
[] 表示的是:范围 [0-9]表示的是0-9之间的任意一个数字"789"
[1-7]表示的是1-7之间的任意的一个数字
[a-z] 表示的是a-z之间所有的小写字母的任意一个
[A-Z] 表示的是 所有大写字母中的任意一个
[a-zA-z]表示的是: 所有的字母的任意一个
[0-9a-zA-Z]表示的是 所有数字或者字母中的一个
| 代表或者
[0-9]|[a-z] 表示的是要么是一个数字 要么是一个小写字母
() 分组 提升优先级
([0-9])|(1-5)|(a-z)三组 从最左边开始计算
限定符
* 代表 0次或多次
[a-z][0-9] 小写字母中的任意一个 后面要么是没有数字要么是多个数字
+ 表示的是至少一次
[a-z][9]+ 小写字母一个后面最少一个9 或者多个9
? 表示的是: 前面的表达式出现了0次到一次 最少0次 最多1次
[a-z][9]?
限定符: 限定前面的表达式出现的次数
{} 更加的明确前面的表达式出现的次数
{0,} 表示的是前面的表达式出现了0到多次 和*一样
{1,} 表示的是前面的表达式出现了1次到多次 和+一样
{0,1} 表示的是前面的表达式出现了0次到一次 和 ?一样
{5,10} 表示的是前面的表达式出现了5次到10次
{4}前面的表达式出现了4次
^ 表示的是以什么开始,或者取反 ^[0-9]以数字开头
^[a-z]以小写字母开头
[^0-9]去反 非数字
[^a-z]取反,非小写字母
[^0-9a-z]不以小写字母数字开头
$ 表示的是以什么结束 [0-9][a-z]$ 必须以小写字母结束
\d 数字中的任意一个
\D 非数字中的一个
\s 空白符中的一个
\S 非空白符
\w非特殊符
\W 特殊符号
\b 单词的边界
.除了\n以外的任意一个单个字符
[]范围
()分组 提升优先级
| 或者
* 0-多
+ 1到多
? 0-1
{0,} 和*
{1,} 和+
{0,1} 和?
\d 数字中的一个
\D 非数字
\s 空白符
\S 非空白符
\w 非特殊字符
\W 特殊字符
^ 以...开头
$以...结尾
\b 单词边界