JavaScript速记
JavaScript常见知识点积累,包括数据类型、数值转换、对象、原型与原型链、作用域与闭包等等,持续整理更新,如有错误请指正,甚是感激
本文链接:JavaScript那些磨人的小妖精
作者:狐狸家的鱼
GitHub:八至
数据类型
一共有七种数据类型,主要为两大类:原始类型、对象类型
1.基础类型(原始值)
- 数值
number
:用于任何类型的数字,包括整数或浮点数 - 字符串
string
:字符串 - 布尔值
boolean
:逻辑类型,true
和false
- 空值
null
:未知的值 - 无定义
undefined
:未定义的值 symbol
:创建对象的唯一标识符(ES6
新增)
2.复杂类型(对象值)
- 对象
object
:复杂的数据结构
3.instance操作符
用来比较两个操作数的构造函数。
4.隐式转换
显示转换主要涉及三种转换:
- 值->原始值:
ToPrimitive()
- 值->数字:
ToNumber()
- 值->字符串:
ToString()
内置类型的构造函数隐式转换
- 转换为字符串:
''+10==='10'//true
将一个值加上空字符串可以转换为字符串类型 - 转化为数字:
+'10' === 10//true
使用一元的加号操作符,把字符串转换为数字 - 转换为布尔值:使用否操作符两次
- !!'foo'; // true
- !!''; // false
- !!'0'; // true
- !!'1'; // true
- !!'-1' // true
- !!{}; // true
- !!true; // true
运算符
- 算术运算符:加减乘除(
+-*/
)、指数(**
)、余数(%
)、自增(++
)、自减(--
)、数值、负数值 - 比较运算符:大于(
>
)、小于(<
)、大于或等于(>=
)、小于或等于(<=
)、相等(==
)、严格相等(===
)、不相等(!=
)、严格不相等(!==
) - 布尔运算符:取反(
!
)、且(&&
)、或(||
)、三元(? :
) - 二进制位运算符
数组Array
对象允许存储键值化的集合,可以存储任何类型的元素
1.方法
添加/移除元素 pop/push
、shift/unshift
unshift
:在数组首部添加一个元素shift
:取出并返回第一个元素push
:在末尾添加一个元素pop
:取出并返回最后一个元素
添加/删除/插入元素splice()
/slice()
- arr.splice(index[], deleteCount, elem1, ..., elemN])
- 从索引位置删除几个元素,并用另外的元素替换它们。
- 将
deleteCoun
t 设置为 0,splice
方法就能够插入元素而不用删除arr.slice(start, end)
- 从所有元素的开始索引 "start" 复制到 "end" (不包括 "end") 返回一个新的数组
合并数组concat()
- arr.concat(arg1, arg2...)
查询数组 sort()
- 1.
indexOf/lastIndexOf
和includes
arr.indexOf(item, from)
从索引from
查询item
,如果找到返回索引,否则返回-1
arr.lastIndexOf(item, from)
和上面相同,只是从尾部开始查询arr.includes(item, from)
从索引from
查询item
,如果找到则返回true
- 2.
find
和findIndex
- let result = arr.find(function(item, index, array) {
- // 如果查询到返回 true
- });
item
是元素index
是它的索引array
是数组本身
- let result = arr.find(function(item, index, array) {
返回true
停止查询,返回item
,没有查询到结果则返回undefined
。
arr.findIndex
与之一样,不过返回的是元素索引而不是元素本身。
过滤数组filter()
返回所有匹配元素组成的数组
- let results = arr.filter(function(item, index, array) {
- // 在元素通过过滤器时返回 true
- });
转换数组
map()
迭代并返回数组中每个元素调用函数并返回符合结果的数组
- let result = arr.map(function(item, index, array) {
- // 返回新值而不是当前元素
- })
sort()
:数组排序reverse()
:颠倒数组,然后返回它
迭代forEach
允许为数组的每个元素运行一个函数
- arr.forEach(function(item, index, array) {
- // ... do something with item
- });
遍历数组
- 老方法for循环:
for(let i=0; i<arr.length; i++)
for...of
:不能获取当前元素的索引,只能访问items
for...in
(不推荐)forEach
对象(Object
)
- 对象是用来存储键值对和属性的实体
- 对象是单个实物的抽象
1.属性的getter
和setter
属性分为两种:数据属性和访问器属性。
当读取属性值时,用getter
,当设置属性值时,使用setter
。
2.对象操作
- 访问属性的方法
- 点符号:
obj.property
- 方括号:
obj["property]
- 点符号:
- 删除属性:
delete obj.property
- 检查属性是否存在:
key in obj
- 遍历对象:
for(let key in obj)
- 对象根据引用来复制或者赋值:变量存储的不是对象的“值”,而是值的“引用”(内存地址)。所以复制变量或者传递变量到方法中只是复制了对象的引用。 所有的引用操作(像增加,删除属性)都作用于同一个对象
- 深拷贝使用
Object.assign
或者_.cloneDeep(obj)
3.原型与原型链
原型prototype
每个函数都有一个prototype
属性,指向对象。
- function foo()
- typeof foo.prototype; //Object
对于构造函数来说,生成实例的时候,该prototype
属性会自动成为实例对象的原型
作用
对象的属性和方法定义在原型上,那么所有实例对象都能共享,节省内存。
- function Person(name){
- this.name = name;
- }
- person.prototype.sex = 'male';
- let jack = new Person('jack');
- let mark = new Person('mark');
- jack.sex;//'male'
- mark.sex;//'male'
构造函数Person
的prototype
属性,就是实例对象jack
和mark
的原型对象,它俩都共享了该属性。
原型对象的属性不是实例对象自身的属性。修改原型对象时,会体现在所有实例对象上,因为原型对象是共享的。
如果实例对象自身有某个属性或方法,实例对象不会取原型对象上获取。 如果
原型链
形成一个原型链:对象到原型,原型到原型...
- 所有对象都有自己的原型对象
prototype
- 对象可以充当其他对象的原型
- 原型对象本身也是对象,所有它也有自己的原型
- 所有对象的原型最终上溯到
Object.prototype
,继承它的属性 Obejct.prototype
的原型是null
,也就是没有自己的原型,原型链的尽头就是null
- Object.getPrototypeOf(Object.prototype)
- // null
- 读取对象的某个属性时,
JavaScript
引擎先寻找对象本身的属性,如果找不到,就到它的原型去找,如果还是找不到,就到原型的原型去找。如果直到最顶层的Object.prototype
还是找不到,则返回undefined
。 - 如果对象自身和它的原型,都定义了一个同名属性,那么优先读取对象自身的属性,这叫做“覆盖”(
overriding
)
原型方法
Object.create()
:j接受一个对象作为参数,然后以它的原型返回一个实例对象,完全继承原型对象的属性Object.setPrototypeOf
:为参数对象设置原型,返回该参数对象。接受两次参数,第一个为现有对象,第二个为原型对象Object.getPrototypeOf
:返回参数对象的原型Object.prototype.isPrototypeOf()
:判断该对象是否为参数对象的原型Object.prototype._proto_
:返回该对象的原型。_proto_
属性指向当前对象的原型对象,即构造函数的prototypr
属性
- let Person = function(){};
- let people = new Person();
- Object.getPrototypeOf(people);//Person.prototype
- 获取实例对象
obj
的原型对象有三种方法:obj._proto_
obj.constructor.prototype
Objct.getPrototyprOf(obj)
Object.getOwnPropertyNames
:返回一个数组,元素是参数对象本身所有属性的键名Object.prototype.hasOwnProperty()
:返回布尔值,判断某个属性在对象自身还是在原型链上
hasOwnPrototype
属性(推荐用于遍历对象属性)
- 判断一个对象是否包含自定义属性而不是原型链上的属性
hasOwnProperty
是JavaScript
中唯一一个处理属性但是不查找原型链的函数
constructor
属性
prototype
对象有一个constructor
属性,默认指向prototype
对象所在的构造函数
- function Person(){};
- Person.prototype.constructor;//Person
constructor
属性定义在prototype
对象上面,意味着可以被所有实例对象继承- 修改了原型对象,一般会同时修改
constructor
属性
instanceof
运算符
- 返回一个实例,检验对象是否为某个构造函数的实例
instanceof
运算符只能用于对象,不适用原始类型的值- 对于
undefined
和null
,instanceOf
运算符总是返回false
对象拷贝
- 确保拷贝后的对象与元对象具有相同原型
- 确保拷贝后的对象与原对象具有相同的实例属性
- let copyObj = origin => {
- return Obejct.create(
- Object.getPrototypeOf(origin),
- Obejct.getOwnPropertyDescriptors(origin)
- );
- }
this
关键字
1.涵义
this
在构造函数中,表示实例对象- 不管在什么场合,它总是返回一个对象
this
就是属性或方法“当前”所在的对象this
的指向是可变的,因为属性所在的当前对象可变this
的实质就是在函数体内部,指代函数当前运行环境- 在全局环境执行,
this
指向全局环境 - 在
obj
环境执行,指向obj
- function Person(){
- return "我是" + this.name;
- }
- let jack = {
- name:"jack",
- resume:Person
- };
- let mark = {
- name:"mark",
- resume:Person
- };
- jack.resume();//"我是jack"
- mark.resume();//"我是mark"
2.使用场合
- (1)全局环境:只要全局环境下使用
this
,它指向的是顶层对象window
- (2)构造函数:指向实例对象
- (3)对象的方法:指向方法运行时所在的对象
- (4)显示设置
this
:当使用Function.prototype
的call
/apply
方法时,函数内的ths
·会被显示设置为函数调用的第一个参数
3.绑定this的方法
call()
:可以指定函数内部this
的指向(即函数执行时所在的作用域),函数在指定作用域中调用该函数,- 其参数是一个对象,为空时,
null
和undefined
传入全局对象 - 其参数是一个原始值,会自动转为对应的包装对象,然后传入
call
方法
- 其参数是一个对象,为空时,
- let obj = {};
- let person = function (){
- return this;
- }
- person();//window
- person.call(obj);//obj
全局环境运行函数person
时,this
指向全局环境(window
),call
方法改变this
指向对象obj
apply
:与call
类型,唯一不同就是它接收一个数组作为函数执行时的参数
- function.apply(thisValue, [...arr]);
第一个参数是this
指向的对象,为null
或undefined
时,传入全局对象。
第二个参数是数组,其元素依次作为参数传入原函数。
bind()
:将函数体内的this
绑定到某个对象,然后返回一个新函数
- let person = function(name, sex){
- return "我叫" + name + "," + sex;
- }
- let obj = {
- name:"jack",
- sex:21
- }
- let new = person.bind(obj);
- new();//我叫jack,21
4.this使用注意点
- 避免多层套用
this
- 避免数组处理方法中使用
this
- 避免回调函数中使用
this
- 函数声明时的
this
只有等到调用时才会有值 - 箭头函数没有
this
,在箭头函数内部访问的都是来自外部的this
值
JavaScript速记的更多相关文章
- 浅谈js中的this关键字
---恢复内容开始--- this是JavaScript中的关键字之一,在编写程序的时候经常会用到,正确的理解和使用关键字this尤为重要.接下来,笔者就从作用域的角度粗谈下自己对this关键字的理解 ...
- 【javascript】您好, 您要的ECMAScript6速记套餐到了
[前言]本文“严重参考” 自阮一峰老师写的文档,在此我郑重感谢他沉默无声的帮助 总结一下ES6为 javascript中的 对象/数组/函数 这JS三巨头所提供的更简洁优雅的书写方式,以及扩展的API ...
- 【javascript】您好, 您要的ECMAScript6速记套餐到了 (一)
[前言]本文“严重参考” 自阮一峰老师写的ES6文档,在此我郑重感谢他沉默无声的帮助 总结一下ES6为 javascript中的 对象/数组/函数 这JS三巨头所提供的更简洁优雅的书写方式,以及扩展的 ...
- JavaScript DOM 编程艺术(第2版)读书笔记 (9)
三位一体的网页 结构层:由HTML或XHTML之类的标记语言负责创建: 表示层:由CSS负责完成: 行为层:负责内容应该如何响应事件这一问题.这是由JavaScript语言和DOM主宰的领域. 分离 ...
- 【JavaScript】JavaScript中的陷阱大集合
本文主要介绍怪异的Javascript,毋庸置疑,它绝对有怪异的一面.当软件开发者开始使用世界上使用最广泛的语言编写代码时,他们会在这个过 程中发现很多有趣的“特性”.即便是老练的Javascript ...
- ES6速记手册
1.三元操作符 这是一个很好的节省代码当你想要编写一个如果. . else语句在一线. 普通写法: const x = 20;let big;if (x > 10) { 速记: const bi ...
- JavaScript看书笔记01
JavaScript看书笔记... ------------------- JavaScript允许var定义语句出现在函数内部的任意位置.JS中使用Var来显示的给变量声明 JavaScript是一 ...
- 《JavaScript Dom 编程艺术》读书笔记-第9章
SS-DOM,本章内容: style属性 如何检索样式 如何改变样式三页一体的网页 结构层:由HTML或XHTML之类的标记语言负责创建.标签(tag)也就是尖括号里的单词,对网页内容的语义含义做出了 ...
- Google JavaScript样式指南
Google JavaScript样式指南 目录 1简介 1.1术语说明 1.2指南说明 2源文件基础知识 2.1文件名 2.2文件编码:UTF-8 2.3特殊字符 3源文件结构 3.1许可或版权 ...
随机推荐
- activemq配置安装
1.了解JMS查看百度百科 https://baike.baidu.com/item/JMS/2836691?fr=aladdin 2.了解ActiveMQ https://baike.baidu.c ...
- MySQL中SELECT语句简单使用
最近开始复习mysql,查漏补缺吧. 关于mysql 1.MySQL不区分大小写,但是在MySQL 4.1及之前的版本中,数据库名.表名.列名这些标识符默认是区分大小写的:在之后的版本中默认不区分大小 ...
- IE中iframe标签显示在DIV之上的问题解决方案
在做网页时前端时,使用IE打开时会出现标题栏DIV被遮挡PDF遮挡, 后在stackoverflow中查到是IE浏览器的问题:链接https://stackoverflow.com/questions ...
- java 线程池 ---- newSingleThreadExecutor()
class MyThread implements Runnable{ private int index; public MyThread(int index){ this.index = inde ...
- 测者的测试技术手册:自动化的自动化EvoSuite:Maven项目集成EvoSuite实战
EvoSuite是由Sheffield等大学联合开发的一种开源工具,用于自动生成测试用例集,生成的测试用例均符合Junit的标准,可直接在Junit中运行.得到了Google和Yourkit的支持. ...
- ngnix简单使用
NGINX是一个高性能HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器,是由伊戈尔·塞索耶夫为俄罗斯访问量第二的Rambler.ru站点开发的,第一个公版发布于2004年10月4日 ...
- [转载]——说说IO
本文转载自"和你在一起"的"说说IO"系列文章https://pengjiaheng.iteye.com/,总共分为8篇,特意整理.收录在此,支持原创.尊重原创 ...
- Linux学习历程——Centos 7 ls命令
一.命令介绍 ls命令用于显示目录中的信息. ----------------------------------------------------------------------------- ...
- easyui实现分页
主要参考官方的文档,欢迎评论 1.集成easyui,下面是我的引入方式,我引入到了head.html 每次只要引入该页面就可以了. <!-- easyui样式支持 --><link ...
- <input>内容居中、去框、不可编辑等
<input class="i" type="text" value="Sin(x)" readonly="readonly ...