ES5

JS基础整理

注意:
console.log(2 + undefined + 3) === NAN 只要带
console.log(2 + true + 3) === 6 true会解析成1,false解析为0
0、
1、 0、空字符串、null、undefined、false、NAN,都会转化为false
2、 非0数字、非空字符串、非空对象都会转化为true
0.0、 json的理解(只能用双引号)
1、属性名必须用双引号包裹
2、检验JSON格式是否正确,可以使用 JSON.parse(json); 如果是正确的JSON格式,会返回一个对象
1、
0、window:对象的最高级
1、BOM——浏览器对象(window对象)(网页一打开就会存在,允许js操作浏览器)可以操作浏览器窗口,比如弹出框、控制浏览器跳转、获取分辨率等
2、DOM——文档对象(document对象)(可以访问和操作html的所有元素)DOM可以把HTML看作是文档树,通过DOM提供的API可以对树上的节点进行操作。
3、document是连接bom和dom的

0.1、 基本数据类型和引用类型的区别?
基本数据类型?(undefined,boolean,number,string,null) 用typeof来判断类型
1、基本类型的访问是按值访问,可以操作保存在变量中的实际的值,但是值是不可改变
2、基本类型变量时存在栈区的,栈是包括了变量的名和变量的值
3、基本类型不能添加属性和方法,相互比较的时候只有值相等的话才相等,而且基本类型的值是不可变的
4、基本类型的赋值,两个变量赋值的话,其中一个只是副本,是相对独立的,是两块不同的内存空间

 引用类型的区别?(object,array,function) 用instanceof来判断类型
1、引用类型的访问是按引用地址访问,值是可变的
2、引用类型的存储是共同保存在堆区和栈区的,栈区内保存变量的名和指向当前对象的堆区的指针(也就是存的是堆区的地址)
3、引用类型可以有属性和方法,引用类型的比较是引用地址的比较(也就是比较两个对象在堆地址中是否相等,不一定相等)
4、引用类型的赋值,其实是指针的副本,但是内存地址用的还是一个,所以修改一个对象属性的值,所有的对象都会跟着改变
     (从一个变量向另一个变量复制引用类型的值,复制的其实是指针,所以两个变量都指向同一个对象)

注意:
1、js是基于对象,对象中的一些操作是
属性,用于存取值
方法,用于执行特定操作
原型链,可以继承或者共享以上两者

1、数组和对象的区别?
1、数组可以通过length获取到长度,而对象不可以
2、如果是以命名索引创建的数组,其实就是个对象 $arr[‘firname’] = ‘zjw’ 如果是这样的获取不到length
3、在数组中使用数字进行索引,数组是特殊的对象,具有数字索引
4、在对象中使用命名进行索引
5、因为数组和对象返回的类型都是object,可以通过Array.isArray()来判断是否是数组,也可以用instanceof来判断
6、引用类型,从一个变量向另一个变量复制引用类型的值,复制的其实是指针,所以两个变量都指向同一个对象
2、var x = ‘zjw’ + 8 + 7 == zjw87
var x = 8 + 7 + ‘zjw’ == 15zjw
3、因为JavaScript语言的链式作用域结构,子对象可以一级一级的向上寻找父对象的变量,
所以,父对象的所有变量对子对象都是可见的,但是因为是单向作用域链,所以反之不成立
4、typeof 可以查看变量类型 name = 123;typeof name 》 number
注意:如果是引用类型的话,(array,object) 用instanceof来进行判断
注意:
1、当是数组的时候,返回的也是object,因为js中数组也属于对象,数组有长度,对象没长度的属性
2、当值是undefined的时候,判断类型也是undefined
3、当值是null的时候,返回的是object(可以通过给对象设置null值或者undefined来清空对象)
4、当值是空的字符串的时候返回的是string
总结:
1、数组、对象、null 都返回类型是object,(因为null是一个不存在的对象占位符)
2、null 和 undefined值相等,但是类型不一样,(因为undefined是null派生出来的,但是类型不相等)
3、当遇到未定义的,返回的类型也是undefined
var a; var b=null
console.log(typeof a); (undefined)
console.log(typeof b); (object)
console.log(typeof c) (undefined)
5、undefined:当对变量进行声明,但是没有赋值的情况下,值为undefined
5、this指向问题
1、函数中的this,指向的是window对象,在全局作用域里面指向的也是window对象
2、方法中的this,指向的是当前对象,指的是谁调用的这个
6、null :当对象不再使用的时候,可以赋值为null
1、var name = “zjw”; 当前变量会占据一块内存
2、var name = null; 当给变量设置为null的时候,这块内存会被回收,执行垃圾回收机制
3、null == undefined 是为true
7、内存区分:
1、栈空间:string,number 根据数据类型来存放
2、堆空间:object
3、编写的代码存入的是硬盘,当运行代码的时候,浏览器会将硬盘中的代码加载到内存中
8、数据类型的转换
1、将其他类型转为数字类型
1、(Number):var msg = “123”; var num = Number(msg); 输出是number类型
注意:var msg = “zjw”; 输出的类型是数字类型,但是不能输出数字,所以是NAN,类型是Number
布尔类型转数字的话:true == 1,false == 0
undefined转数字的话:NAN
NULL转数字的话:0
2、parseInt:将字符串转为数字类型
注意:当parseInt(‘abc123’) 输出的就是 NAN Number类型
当parseInt(‘123abc’) 输出的就是 123 Number类型
当转化的是字符串字符,类型就是NAN, 当转化的是字符串数字,就是Number
3、parseFloat:将字符串转为数字类型
2、将其他类型转为字符串类型
1、toString(),注意:不能将null和undefined转为字符串,会报错的
2、String()
3、将字符串通过加号拼接的时候也可以转为字符串(隐式转换)
3、减法会进行隐式转换,但是加法不会隐式转换 “5” - 2 // 返回3 因为 “5” 被转换为 5
“5” + 2 // 返回 52 因为 2 被转换为 “2”
3、将其他类型转为布尔类型
1、Boolean:转为布尔类型为false的通常有5种,“”空字符串,0,-0,undefined,null,NaN
9、JSON函数
1、JSON.stringify(value):将js中的值(一般为对象或数组)转为json字符串
2、JSON.parse(value):将json的字符串转为对象
10、转码函数
1、encodeURIComponent(value):将字符串进行编码,更安全
2、decodeURIComponent(value):将字符串进行解码
11、字符串函数
1、split(’/’):以某个字符将字符串分割成数组 (address_item.area_info.split(’/’))
12、数组函数
1、join(’/’): 数组转字符串,可以规定用什么字符分割
2、slice(2):数组中进行截取
3、toString(): 可以将数组转为用逗号隔开的字符串
13、js数组排序
1、arr.sort 针对于字符串数组进行排序,可以根据首字母对数组进行排序
2、arr.sort(function(a, b){return a - b}); 针对于数字数组进行排序,需要传入一个比值函数进行比较,
如果不传比值函数,只是对数字的第一个值进行比较并且排序
13、new的理解?
new的时候会申请内存,创建一块内存空间,创建一个对象,函数体内部的this指向会指向该内存
后台会隐式执行new Object()创建对象。所以,通过new创建的字符串、数字是引用类型,而是非值类型。
14、构造函数和普通函数的区别?
1、通过new 关键字来实例化的函数叫构造函数,构造函数是为了初始化对象,和new一起使用。
new在创建对象的时候,从无到有,为了就是在初始化的时候为对象添加一些属性和方法
2、每一个函数(除了箭头函数)都有一个prototype属性(是一个对象),这个对象称为原型对象,
通过prototype定义的属性和方法才是这个类的公用的,
否则都是函数的私有变量,函数外是调用不到里面的属性和方法的
3、 var arr = []; 为 var arr = new Array(); 的语法糖。
   var obj = {} 为 var obj = new Object(); 的语法糖
    var date = new Date();
4、普通函数的调用方式:Person();
1、没有返回值,是undefined,不会创建新对象
5、构造函数调用方式: new Person(); 函数体内部的this指向会指向该函数
1、有返回值,会创建一个新的对象,并返回
15、原型的理解?(通过new一个构造函数会初始化一个对象,对象的属性是_proto,构造函数的属性是prototype,他俩相等)
function F() {} //构造函数,属性是prototype,是原型对象,prototype对象有一个constructor属性,是构造函数本身
f1 = new F(); //由构造函数构造出的对象,属性是_proto_,是普通对象,所有的对象都可以使用原型对象的属性和方法。
f2 = new F(); // (对象中的__proto__就是构造函数中prototype定义的初始值)
1、每一个函数都有一个prototype属性(是一个对象),这个对象称为原型对象,原型对象包含函数实例共享的方法和属性,
2、构造函数通过prototype属性可以访问到原型对象。原型可以有属性和方法。
3、__proto__是某个对象(f1,f2)的属性,它指向这个对象的原型对象。从上面的例子分析,f1.__proto__和f2._proto__就等同于F.prototype。
4、prototype对象有一个constructor属性,F(构造函数).prototype.constructor其实就是构造函数的本身
5、prototype是构造函数的一个属性,它的值就是由这个构造函数构造出来的对象的原型对象
换句话来说,prototype既是构造函数的属性,F.prototype的属性和方法都会被f1和f2“继承”。
注意:f1.constructor === F ----》true 因为会继承
6、多个对象中如果有相同的属性和方法,可以把这些方法写到原型对象里面(prototype)
16、原型链的理解? (就是通过__proto__属性将对象连接起来的,就叫原型链)
1、 每一个对象都有自己的原型对象(proto),一层层就形成了原型链,
2、原型链的最顶端就是构造函数的prototype(F.prototype),构造函数没有原型对象null
3、原型链后面的对象可以使用前面对象的属性(this.name,this.age)和方法(this.getUserInfo()), 继承性
4、当我们调用一个对象属性的时候,如果当前对象没有该属性,那么就会去当前对象的(proto)属性中指向的父对象中找,
就会向当前对象的上一层原型对象找该属性, 一直往上找,会找到构造函数里面原型对象,因为构造函数没有原型对象,最后会返回一个null
5、JS在创建对象(不论是普通对象还是函数对象)的时候,都有一个叫做_proto 的内置属性,用于指向创建它的构造函数对象的原型对象prototype.。
这个有
proto _ 串起来的 直到Object(构造函数).prototype.
proto _为null的链叫做原型链
17、prototype和__proto_的区别?
1、prototype: 只有函数才有的属性,它指向了一个对象,这个对象正是调用该构造函数而创建的实例的原型,也就是这个例子中的car1和car2的原型。
(原型:每一个JavaScript对象(null除外)在创建的时候就会与之关联另一个对象,这个对象就是我们所说的原型,每一个对象都会从原型”继承”属性)
2、proto : 每个对象都有的属性,它指向该对象的原型。car1.proto
=Car.protopyte
3、construcotr: 每个原型对象都有一个constructor属性指向关联的构造函数
4、当读取普通对象的属性时,如果找不到,就会查找与对象关联的原型中的属性,如果还查不到,就去找原型的原型,
一直找到最顶层为止。所以原型对象是通过Object构造函数生成的,结合之前所讲,实例的proto指向构造函数的prototype.
17、原型继承?
1、所有 JavaScript 对象都从原型上继承属性和方法。
2、日期对象继承自 Date.prototype。数组对象继承自 Array.prototype。
3、但是Object.prototype 位于原型继承链的顶端
4、日期对象、数组对象都继承自 Object.prototype。
18、链式调用的理解?
1、链式调用的原理就是当前实例在调用内部方法的之后,方法会返回当前调用对象的实例对象(this)
因为返回了当前的this对象就可以继续访问自己的原型了。
19、闭包的理解?(子函数可以使用父函数中的局部变量)
(就是通过改变js的垃圾回收机制,可以拿到函数内部局部变量的函数,闭包是函数内部和函数外部连接的桥梁)
1、当一个函数执行完毕的时候,里面的局部变量会被JS中自带的垃圾回收机制销毁掉,释放内存。可以通过在函数内部返回一个函数,
而且函数里面有用到父级函数中声明的局部变量,那么这个局部变量就不会让垃圾回收销毁掉。因为这个局部变量有可能用到,
外部可以通过函数访问到这个父级函数中下的局部变量
2、可以在函数的外部访问到函数内部的局部变量
3、闭包函数让这些局部变量始终保存在内存中,不会随着函数的结束而自动销毁
4、滥用闭包会导致内存泄露,因为闭包函数中定义的变量永远不会被释放
5、在函数外部读取函数内的局部变量的操作,就要用到闭包
6、闭包函数引用了父函数中的变量,因为这个变量正在使用,所以它不会被回收,
7、返回闭包的时候不需要加括号 return demo;,调用的时候才需要加括号 demo()
注意:父函数返回的是一个函数,需要再一次调用这个函数才可以获取到函数内部的变量
20、js垃圾回收机制?(标记清除和引用计数)
1、js中的内存管理是自动执行的,
2、当没有被引用的对象就是垃圾,需要清除
3、当变量进入环境时(例如在函数中声明一个变量),将这个变量标记为“进入环境”,
当变量离开环境时,则将其标记为“离开环境”。标记“离开环境”的就回收内存。
21、内存泄露的理解?(当程序未能释放不再使用的内存就会造成内存的浪费)
什么可以引起内存泄露?
1、意外的全局变量引起的内存泄露
2、闭包引起的
3、被清理的DOM元素的引用
4、被遗忘的定时器或回调
22、call、apply、bind的理解?
(三者调用目的都是改变调用对象的this指向,第一个参数都是this要指向的对象,第二个参数以及后面参数都是需要传入的参数)
(通过动态改变this的指向,可以实现当一个对象没有某个方法,但是其他对象有,可以借助这几个函数进行操作获取)
call:(可以改变this的指向之后,还会再次执行这个函数)
1、call是在原型上(prototype)的方法,fn.call(obj);
2、fn函数中的this指向的是window对象
3、加上call之后,就把this的指向换成括号里面的东西,然后再执行fn函数
4、给函数传参的时候是一个一个传递值的
5、可以实现继承
6、call是apply的语法糖
apply:(可以改变this的指向之后,还会再次执行这个函数)
1、和call的区别就是传递函数的参数是有区别的
fn.call(obj , 100 , 200);
fn.apply(obj , [100, 200]);
2、给函数传递值的时候,是把所有值放到一个数组里面进行传递
3、可以实现继承
bind:(可以改变this的指向之后,但是不会立即执行这个函数,用到之后再执行)
1、先把this改变成我们想要的指向结果,并且把参数一个个的准备好
2、不会立即执行这个函数,而是等以后用到了再执行
var tempFn = fn.bind(obj, 1, 2);
tempFn();
3、bind()方法会创建一个新函数
23、深拷贝和浅拷贝的理解?
将一个对象中的属性拷贝到其他属性相同的对象里面
24、节流和防抖的理解?(因为js是事件驱动,一些频繁的操作事件会造成性能的损耗,可以通过防抖和节流进行限制)
1、防抖:监听用户在某个时间内,没有再次触发事件,就会执行网络请求。
(密集的事件触发,我们只希望触发比较靠后发生的事件)
2、节流:在某个时间内,某个函数
(密集的事件触发,是按照一定的频率进行调用)
25、js中创建对象的两种方式?
1、通过创建构造函数来创建新的对象
2、var obj = { }
26、本地存储有哪几种方法?
1、HTML5 WEB存储(localStorage和sessionStorage)
1、这两种存储方式比存cookie更安全,更快,存储的数据也多
2、使用前应该查看浏览器是否兼容
3、可以存key/value对的数据,一般可存的大小为5MB
4、使用的Api都相同
1、保存数据,localStorage.setltem(key,value)
2、读取数据,localStorage.getltem(key)
3、删除单个数据,localStorage.removeltem(key)
4、删除所有数据,localStorage.clear()
2、Cookie
1、可以存key/value对的数据,遵守同源策略
2、存放的数据小,为4K左右
3、会存在http请求头中
27、localstorge本地存储理解?
1、用于长久保存网站的数据,保存的数据没有过期时间的,必须手动才可以清除
2、只读
3、遵守同源策略
28、sessionStorage本地存储的理解?
1、用户关闭浏览器时,数据会删除
29、Session 和 Cookie 区别?
注意:
1、因为HTTP是一个无状态的连接协议(就是记不住上一次请求服务端保留的信息),所以HTTP自身不具备保存之前发送过的请求或者响应的功能。
用Session 和 Cookie机制就是为了克服 http 协议无状态的问题(都是用来保持用户和服务端的交互状态的 ,记录稳定的用户信息)。

  Cookie:工作原理:(第一次发生请求时,服务端创建cookie,通过http响应头的Set-Cookie属性把用户信息存放在客户端,
                  当再次发生请求的时候,客户端会把保存的cookie一起发生给服务端,然后服务端就可以获取到客户端的状态信息)
       1、用于记录在一段时间内,访问的用户是不是同一个用户
       2、cookie基于http响应头,将数据通过http协议头从客户端传入服务端,然后再由服务端传回客户端,在浏览器中是可见的,能进行修改、添加、删除
       3、只能存储字符串,大小不能超过4k
       4、不安全性,对客户端是可见的,数据存在客户端
       5、会话cookie:如果不设置过期时间,只要关闭浏览器,cookie就会失效,存在内存里,不同的浏览器有不同的处理办法
            持久cookie:  如果设置了过期时间,cookie会一直存在,直到过期时间,存在硬盘上,不同的浏览器可以实现共享
       6、是http协议头的一部分
       7、支持跨域名访问

 Session:工作原理:(客户端第一次发生请求时,服务端创建Session并保存信息,然后生成session id返回并保存在客户端的cookie
                       当再次发生请求的时候,会将session id一起发生给服务端,会根据id来获取到保存的相应数据)
      1、Session是基于cookie工作的,把session id存入到cookie中,每一个用户拥有一个session id
      2、Session是基于cookie的,当第一次访问就将数据存入到服务端,然后通过cookie再将这个session id返回到客户端,
           两端之间的联系是由这个session id进行通信,当做唯一标识
      3、session可以存对象,大小为5M
      4、安全性,数据存在服务端
      5、如果设置超时时间过大的话,会造成内存泄露(如果把session id存在cookie中并设置过期时间,就不会关闭浏览器销毁session了)
      6、Session id保存在客户端可以使用cookie保存、也可以使用表单hidden隐藏、url重写,然后再发送给服务端
      7、当并发高的话会产生很大session,消耗服务器性能,(可以将信息加密存入到cookie,然后发送的服务端进行解密获取用户信息)
      8、不支持跨域名访问

29、函数表达式和函数声明的理解?
1、当function是声明中的第一个词,就是函数声明, 会变量提升
function demo(){ } (函数声明)
var demo1 = function(){ } (匿名函数表达式)
var demo1 = function bar(){ } (具名函数表达式)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值