ES5-20 复习

3-1

  • 变量单一声明方式
  • String Boolean undefined Number null
  • undefined == null
  • typeof(null) ‘object’
  • typeof(方法) ‘function’
  • typeof(+) +是运算符,不是数据类型 报错
  • +0 === -0 true
  • +Infinity == -Infinity false
  • NaN和谁都不等
  • 原始值没有属性 要打印属性、调用方法得经过基本包装类
  • 包装了还没有就没办法了,比如length属性
  • Boolean、Number包装了也没有length,打印就是undefined
  • 可以给包装类添加值以外的属性
  • 数字直接跟.有歧义,会认为是小数点
  • 三种基本包装类的toString、valueOf方法各不相干+
  • Function的toString、valueOf都返回函数体?
  • Object的toString
  • Array的toString,返回用逗号隔开
  • 要打印反斜杠,单双引号必须使用字符字面量,否则报错
  • 并且字符字面量还要用引号引起来
  • Object Array Function Date RegExp
  • 对象的属性是字符串类型

一些现象
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3-2

  • 目前证实会终止程序的有:语法错误、范围错误
  • 0/0 NaN
  • 1/0 +Infinity
  • 逗号运算符在表达式中只返回最后一个
  • ASCII码 0-255

在这里插入图片描述

3-3

  • 显示类型转换,Number对null、true、false,数组友好转010
  • Number对空数组和只有一个元素的数组友好
  • Number对undefined、1a不友好转NaN
  • ParseInt只对数字开头的友好
  • null、undefined既不大于也不小于更不等于0(隐式类型转换有坑)
    在这里插入图片描述
// 是否先对数组toString呢
console.log(Number([])) // 0
console.log(Number([1])) // 1
console.log(Number(['1'])) // 1
console.log(Number([1, 2, '3'])) // NaN
console.log(Number([1, 2, 3])) // NaN
console.log(Number({})) // NaN

3-4

  • 函数声明一定要有函数名,不然报错
  • 函数声明不能直接调用(无参),会报语法错误
  • 函数声明function a(){}(1),这样不报错,会认为(1)是表达式不是调用
  • 函数表达式可以()调用,是立即执行了
  • 函数表达式,function后的函数名在外部不可见,但是.name总能获得函数名(优先取function后的,没有就取表达式声明的变量名)
  • es5&&实参非undefined时形参、实参互相统一
  • es6、严格模式,形参、实参不统一
  • 函数是对象

3-5

  • 预编译:函数声明、函数整体提升
  • 变量声明,只有声明提升,赋值不提升,所以AO一开始是undefined
  • -1 + NaN + ‘’ 先做-1 + NaN得到NaN 再 +’’ 得到’NaN’

3-6

  • 看作用域链,函数AO、GO的this指向的是window
  • AO含thisarguments和变量声明、函数声明
  • 闭包是指有权访问另一个函数作用域中的变量的函数
  • 立即执行函数内将闭包添加到全局,无法销毁闭包对AO的引用
  • 闭包不是将被拉扯的AO放到全局!

3-7

  • 表达式会忽略函数名
  • 注意,此时GO里也没有b了
if (function b() { }) {console.log(typeof b) // undefined
}
console.log(b) // 报错
  • 解决闭包总是拿到AO在循环中最后的值,用IIFE并实时传值进去

3-8

  • 对象中的this指向对象本身
  • 构造函数,用new实例化后,函数内this指向实例
  • 不用new实例化,this指向window
  • 当构造函数return引用值时(除了this的函数、函数声明、对象、数组、Date…),返回引用值,若是原始值则忽略
  • 实例方法中的this,谁调用就指向谁
function MyTest(name) {this.name = namereturn this // 写或不写,返回的都是实例
}
console.log(new MyTest('Lee'))

3-10

在这里插入图片描述
在这里插入图片描述

  • 字面量方式改变构造函数prototype(指向新的对象)若在实例化前,则实例的__proto__会指向修改后的原型,若在实例化后,实例的__proto__还是指向默认的prototype
  • 若使用xx.prototype.属性 = 的修改方式(没有指向新对象),则实例访问到的属性也会跟着盖面
    在这里插入图片描述

4-1

  • 对于++ --,会计算再赋值,能让实例增添属性
  • 将null作为实例的原型,实例中将不包含任何属性!,将{}作为原型仍有__proto__
  • 因此,不是所有对象都继承Object.prototype
  • 手动增加的__proto__和自身的不一样,不能在手动增加的_proto__向上查找原型链
  • 原型链的终点是Object.prototype

4-2

  • 要在构造函数(而不是原型)中定义引用类型的属性(防止所有实例共享引用值)
  • 原型链实现继承(子类的原型指向父类的实例)的问题一:子类的实例可能会共享引用类型值(原本是父类构造函数中定义的属性)
  • 问题二:不能传参
  • 借用构造函数(子类构造函数内:父类构造函数call(this)),解决了原型链继承的问题,但函数无法复用超类型原型中的方法,对子类型不可见
  • 组合继承(原型链+借用构造函数),问题:超类的构造函数都执行了2次
  • Object.create(对象,{属性:属性描述符}),第二个参数将属性添加到新对象上
  • 寄生组合式继承用Object.create()指定新对象的__proto__,用**.constructor增强对象,结合call**
  • 圣杯模式实现继承:继承父类原型上的属性和方法,没有解决引用类型值问题,构造函数不能传值

4-3

  • 对象遍历(for (var key in obj))原型上的属性也会打印,用hasOwnProperty区分(严谨)
  • 数组遍历(for (ele val of arr))// ele是每一项arr的值
  • arguments.callee - 正在被执行的函数对象(在自启动函数中使用递归,且不需要函数名)
  • test.caller - test函数的调用者

for…of语句在可迭代对象(包括 Array,Map,Set,String,TypedArray,arguments 对象等等)上创建一个迭代循环,调用自定义迭代钩子,并为每个不同属性的值执行语句,可以由break, throw continue 或return终止。在这些情况下,迭代器关闭。

for…in不应该用于迭代一个关注索引顺序的 Array。

Object.keys() 方法会返回一个由一个给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和正常循环遍历该对象时返回的顺序一致 。
在ES5里,如果此方法的参数不是对象(而是一个原始值),那么它会抛出 TypeError。在ES2015中,非对象的参数将被强制转换为一个对象。

4-4

  • 手写深拷贝,考虑原始值和引用值(区分数组和对象),结合递归

4-5

  • new Array()的参数用于设置数组长度,或设置数组(只传一个非数字值时)
  • 数组方法 - 继承了数组原型上的方法
  • push、unshift(返回值:执行了方法以后数组长度,可以传多个参数)
  • pop、shift(返回剪切掉的那个值)
  • splice(在哪个下标添加,返回值空数组)
  • 数组中认为最后一个元素的index是-1
  • sort是按照ASCII码排列的(未传参时)
  • sort(function(a,b){return 负数})

在这里插入图片描述

4-6

  • concat 返回值是拼接后的数组
  • slice[a,b)
  • join不传参数相当于toString!用逗号连接
  • split(a,b) 不传值,会将整个字符串放进数组;第二个参数b,是用a分割后截取b位
  • 类数组没有数组方法,因为没有继承Array.prototype,继承Object.prototype,类数组
  • 对象转类数组:给对象加splice属性,指向Array原型上的splice方法,对象的原型依然是Object.prototype (有什么意义
  • arguments对象的constructor是Object
  • obj实例调用push方法的原理,和length相关(并不一定是类数组)
  • length属性决定了类数组的长度,push开始的位置
  • 类数组转数组:Array.prototype.slice.call(arguments)、Array.from() (分别是ES5\ES6)
  • 箭头函数没有arguments

4-8

  • finally一定执行
  • throw要写在可能会出错的代码段前, catch(e) 可以抛出自定义信息e
  • JSON.parse()参数不能是空字符串或undefined,必须是JSON字符串
  • with可以改变作用域(因此会消耗性能)

严格模式下不能不写var
严格模式下,函数内部fn使用this指向undefined,但new fn实例化返回的this还是指向实例
严格模式下,函数参数不能重复
严格模式下,对象的属性不能重复
严格模式下,eval有自己的作用域,内部用var声明的变量不再是全局的

Duplicate property name in object literal is allowed in ES6 strict mode

常识归类

  • 1不是质数 2是
  • 质数是只能被1和自己整除的数
  • 斐波那契数列,前2项是1,之后每项为前两项之和
  • ASCII码charCode范围在0-255,每个字符1字节,从256开始的内容每个2字节
  • 闰年(整除4&&不能整除100 || 整除400)

关于this

  • 在函数内部,this的值取决于函数被调用的方式。this值没被设置时(未使用call、apply)默认指向window
  • call、apply传null 和 undefined 会被转换为全局对象。原始值如 7 或 ‘foo’ 会使用相应构造函数转换为对象。
  • bind的this绑定只生效一次:this将永久地被绑定到了bind的第一个参数
  • 当函数作为对象里的方法被调用时,this 被设置为调用该函数的对象
  • 当一个函数用作构造函数时(使用new关键字),它的this被绑定到正在构造的新对象。
  • Object.assign是浅拷贝,JSON.parse(JSON.stringify)是深拷贝
var obj = {count: {a: 1,b: 2}
}
var obj1 = Object.assign({}, obj)
obj1.count.a = 100 
console.log(obj.a) // 100

// 下面的例子令人迷惑,非常危险,没有用处。避免使用它们。
typeof new Boolean(true) === ‘object’;
typeof new Number(1) === ‘object’;
typeof new String(‘abc’) === ‘object’;

关于valueOf

JavaScript调用valueOf方法将对象转换为原始值。
默认情况下,valueOf方法由Object后面的每个对象继承。 每个内置的核心对象都会覆盖此方法以返回适当的值。如果对象没有原始值,则valueOf将返回对象本身。
JavaScript的许多内置对象都重写了该函数,以实现更适合自身的功能需要。因此,不同类型对象的valueOf()方法的返回值和返回值类型均可能不同。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

  • 控制台为什么有这样的迷惑行为…因为自己不小心重写了Object原型上的valueOf方法 = =,以下反面教材不要看
  • 但是为什么Array、Function也受影响呢?原因是他们都是同一个valueOf

The Array prototype object does not have a valueOf property of its own;however,it inherits the valueOf property from the standard built-in Object property Object.
The Function prototype object does not have a valueOf property of its own; however, it inherits the valueOf property from the Object prototype Object.

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

关于隐式类型转换

关系操作符(< > ≥ ≤)

  1. 数字比较比数字
  2. 字符串比较比字符编码值(大写字母<小写字母)
  3. 有一个数字,另一个也转数字(null转0,undefined转NaN,除了和0不能比,null和非0能比较)
  4. 有一个布尔值,把它转为数字
  5. 有一个对象,调用valueOf,没有则调用toString

相等和不相等(== !=)

  1. 有一个布尔值,把它转为数字
  2. 字符串和数字,先将字符串转数字
  3. 有一个对象,调用valueOf得到基本类型值再走以上规则(怎么得到基本类型值,这里有文章)
  4. null、undefined在比较相等性前不得转换(所以和任何比较==都是 false)
  5. 都是对象,比较是不是相同指向
    在这里插入图片描述
  • 关系、相等运算符掺杂了其他运算符,有优先级
    根据运算符优先级 ,! 的优先级是大于 == 的
[] == true // false
[] == ![] // true
{} == !{} // false
console.log({ a: 1 } == '[object Object]') // true
console.log({ a: 1 } == true) // false
console.log([] == '[object Array]') // false 数组toString是空字符串
console.log([] == '') // true
console.log([] == 0) // true
console.log([] == false) // true
const number1 = new Number(3);
const number2 = new Number(3);
number1 == 3;         // true
number1 == number2;   // false
// [] == ! []   ->   [] == false  ->  [] == 0  ->   '' == 0   ->  0 == 0   ->  true

ECMA类型转换

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/251142.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

eclipse中去掉警告提示

有时候我们要去掉这些不必要的提示 下面我们来设置去掉这些警告提示 转载于:https://www.cnblogs.com/xiaostudy/p/9370016.html

vue --- vue-router

vue-router的CDN <script src "https://unpkg.com/vue-router2.5.3/dist/vue-router.js"></script>// 当然还需要导入vue的cdn <script src"https://cdn.jsdelivr.net/vue/2.1.3/vue.js"></script>使用router-link(to)添加点击链…

django-restframework使用

安装restframework: pip install djangorestframework 修改项目settings.py: INSTALLED_APPS [django.contrib.admin,django.contrib.auth,django.contrib.contenttypes,django.contrib.sessions,django.contrib.messages,django.contrib.staticfiles,rest_framework, ]修改项…

JSON基础与数据解析、JSON方法、AJAX初识

JSON JavaScript Object Notation js对象标记是对象&#xff0c;是轻量级数据交互的格式&#xff0c;不能有方法它基于 JavaScript 语法&#xff0c;但与之不同&#xff1a;JavaScript不是JSON&#xff0c;JSON也不是JavaScript映射用:隔开并列数据用,隔开映射的集合用{}包裹键…

iOS开发经验总结

在iOS开发中经常需要使用的或不常用的知识点的总结&#xff0c;几年的收藏和积累&#xff08;踩过的坑&#xff09;。 一、 iPhone Size 二、 给navigation Bar 设置 title 颜色 123UIColor *whiteColor [UIColor whiteColor];NSDictionary *dic [NSDictionary dictionaryWit…

ES5 数组扩展方法 forEach/filter/map的使用与重写

ES3 splice slice join sort &#xff08;IE5、IE6&#xff09; 数组扩展方法 ES5&#xff08;在ES3的基础上增加、修正&#xff09; forEach 可能会改变原数组(直接操作了arr[i]&#xff0c;没有使用深拷贝)参数1&#xff1a;回调函数&#xff08;如果不使用箭头函数&#xf…

187. Repeated DNA Sequences重复的DNA子串序列

&#xff3b;抄题&#xff3d;&#xff1a; All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: "ACGAATTCCG". When studying DNA, it is sometimes useful to identify repeated sequences within the DNA. Write a fun…

ES5 every/some/reduce/reduceRight的使用与重写

被作为实参传入另一函数&#xff0c;并在该外部函数内被调用&#xff0c;用以来完成某些任务的函数&#xff0c;称为回调函数。 break、return用于终止循环的区别&#xff1a; return只能用在函数体内&#xff08;单独一个for循环里直接用return会报错&#xff09;对于多层循环…

【前端统计图】echarts改变颜色属性的demo

一&#xff1a;柱状图改变颜色 图片.png代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title></head><body><!-- 柱状统计图 --><div class"row"><div …

elasticsearch5.x:查询建议介绍、Suggester 介绍以及Java-api实现

elasticsearch5.x&#xff1a;查询建议介绍、Suggester 介绍 参考&#xff1a;http://www.cnblogs.com/leeSmall/p/9206646.html 参考(重点)&#xff1a;https://elasticsearch.cn/article/142 参考&#xff08;官网&#xff09;&#xff1a;https://www.elastic.co/guide/en/e…

DOM-2 document对象、获取元素、节点、遍历树

一、document获取元素 1. 方法 document.getElementById(‘box’) // 在IE8及以下是不分大小写的&#xff0c;而且name值也能匹配上document.getElementsByClassName(’’) // IE8及以下是用不了的document.getElementsByTagName() 都兼容document.getElementsByName() 用的非…

javascript --- js中的事件

事件实现松耦合: // JS和HTML之间的交互是通过事件实现的. // 事件,就是文档或浏览器窗口中发生一些特定的交互瞬间. // 可以使用侦听器来预定事件,以便事件发生时执行相应的代码. // 这种在传统软件工程中被称为观察员模式的模型,支持页面的行为与页面的外观之间的松耦合事件…

centos系统设置局域网静态IP

---恢复内容开始--- centos系统设置局域网静态IP 很多时候&#xff0c;我们并不希望漏油器重启之后&#xff0c;自己的服务器动态的获取IP&#xff0c;这样很不利&#xff0c;因为你可能装了mysql&#xff0c;redis&#xff0c;等软件&#xff0c;然后需要远程去访问这台服务器…

DOM-3 【utils/待讲评】节点属性、方法、封装方法、DOM结构

讲评 节点属性 nodeType 元素节点 1 大写 属性节点 2 文本节点 3 #text 注释节点 8 #comment document 9 DocumentFragment 11 nodeName是只读属性元素节点的nodeName是大写的其余的是#小写的元素节点没有nodeValue属性&#xff0c;null&#xff0c;是可写的其余有&#xff08…

javascript --- DOM0级、DOM2级、跨浏览器 的事件处理程序

DOM0级事件处理程序: // 使用DOM0级方法指定的事件处理程序被认为是元素的方法 // 这个时候的事件处理程序是在元素的作用域中运行: <div id "myBtn" >DOM0</div> <script>var btn document.getElementById("myBtn");btn.onclick fun…

DOM-4 【utils/待讲评】节点创建删除、元素属性设置获取、节点属性

讲评 节点创建 Document.prototype ← document.createElement(div)document.createTextNode(xxx) // 创建文本节点document.createComment(xxx) // 创建注释节点 增加/剪切子节点 Node.prototype ← node.appendChild(node)总是在父元素的最后增加&#xff08;类似push&am…

javascript --- 事件对象和事件类型

// 无论程序使用"DOM0级"规范还是"DOM2级"规范,都会在局部产生一个event对象, // 将其打印出来研究: <div id"divBtn"><button id"rawBtn" >Click Me!</button></div> <script>const divBtn document…

关于APP更新,两包共存的解决方案

大多数是由于包名不一致导致的&#xff0c;一定要注意包名一致、不然手机会认为是两个app&#xff0c;导致两个包共存 查看包名的方法 1、hbuilder打包时会有提示 2、手机打开设置->应用->正在运行->对应app即可查看 转载于:https://www.cnblogs.com/zz-0128/p/827969…

DOM-5【兼容】滚动距离与高度、兼容模式、可视尺寸

查看滚动条的距离 方法版本window.pageXOffset / pageYOffsetIE9/IE8及以下不支持(常规)document.body.scrollLeft/scrollTopIE9/IE8及以下(部分支持&#xff0c;具体看模式)document.documentElement.scrollLeft/scrollTopIE9/IE8及以下(部分支持&#xff0c;具体看模式)wind…

DOM-6 【兼容】读写样式属性、操作伪元素、运动元素初探

规范 <style type"text/css"></style><script type"text/javascript"></script>读写样式属性 .style是访问不到css样式表的&#xff0c;只能访问到行内/内联的属性&#xff0c;当未设置行内属性时&#xff0c;结果为空字符串 设…