JavaScript 精简笔记

JavaScript 精简笔记,摘自 廖雪峰的官方网站。

[From] https://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000

‘use strict‘; //严格模式

JavaScript严格区分大小写。

NaN === NaN; // false

唯一能判断NaN的方法是通过isNaN()函数。

1 / 3 === (1 - 2 / 3); // false

这不是JavaScript的设计缺陷。浮点数在运算过程中会产生误差,因为计算机无法精确表示无限循环小数。要比较两个浮点数是否相等,只能计算它们之差的绝对值,看是否小于某个阈值:

Math.abs(1 / 3 - (1 - 2 / 3)) < 0.0000001; // true

多行字符串: `......`

模板字符串: `你好, ${name}, 你今年${age}岁了!`

操作字符串: toUpperCase, toLowerCase, indexOf, substring

数组:

  var arr = [10, 20, ‘30‘, ‘xyz‘];
  arr.indexOf(10); // 元素10的索引为0

  var arr = [‘A‘, ‘B‘, ‘C‘, ‘D‘, ‘E‘, ‘F‘, ‘G‘];
  arr.slice(0, 3); // 从索引0开始,到索引3结束,但不包括索引3: [‘A‘, ‘B‘, ‘C‘]
  arr.slice(3); // 从索引3开始到结束: [‘D‘, ‘E‘, ‘F‘, ‘G‘]

  var arr = [‘A‘, ‘B‘, ‘C‘, ‘D‘, ‘E‘, ‘F‘, ‘G‘];
  var aCopy = arr.slice(); // 复制数组
  aCopy; // [‘A‘, ‘B‘, ‘C‘, ‘D‘, ‘E‘, ‘F‘, ‘G‘]
  aCopy === arr; // false

  push()向Array的末尾添加若干元素,pop()则把Array的最后一个元素删除掉。

  如果要往Array的头部添加若干元素,使用unshift()方法,shift()方法则把Array的第一个元素删掉。

  sort()可以对当前Array进行排序,它会直接修改当前Array的元素位置,直接调用时,按照默认顺序排序。

  reverse()把整个Array的元素给掉个个,也就是反转。

  var arr = [‘Microsoft‘, ‘Apple‘, ‘Yahoo‘, ‘AOL‘, ‘Excite‘, ‘Oracle‘];
  // 从索引2开始删除3个元素,然后再添加两个元素:
  arr.splice(2, 3, ‘Google‘, ‘Facebook‘); // 返回删除的元素 [‘Yahoo‘, ‘AOL‘, ‘Excite‘]
  arr; // [‘Microsoft‘, ‘Apple‘, ‘Google‘, ‘Facebook‘, ‘Oracle‘]
  // 只删除,不添加:
  arr.splice(2, 2); // [‘Google‘, ‘Facebook‘]
  arr; // [‘Microsoft‘, ‘Apple‘, ‘Oracle‘]
  // 只添加,不删除:
  arr.splice(2, 0, ‘Google‘, ‘Facebook‘); // 返回[],因为没有删除任何元素
  arr; // [‘Microsoft‘, ‘Apple‘, ‘Google‘, ‘Facebook‘, ‘Oracle‘]

  concat()方法把当前的Array和另一个Array连接起来,并返回一个新的Array。

  var arr = [‘A‘, ‘B‘, ‘C‘, 1, 2, 3];
  arr.join(‘-‘); // ‘A-B-C-1-2-3‘

对象:

  如果我们要检测xiaoming是否拥有某一属性,可以用in操作符。 ‘name‘ in xiaoming; // true
  要判断一个属性是否是xiaoming自身拥有的,而不是继承得到的,可以用hasOwnProperty()方法。 xiaoming.hasOwnProperty(‘name‘); // true

条件判断:
  JavaScript把null、undefined、0、NaN和空字符串‘‘视为false,其他值一概视为true。

循环:
  for循环的一个变体是for ... in循环,它可以把一个对象的所有属性依次循环出来。要过滤掉对象继承的属性,用hasOwnProperty()来实现。
  由于Array也是对象,而它的每个元素的索引被视为对象的属性,因此,for ... in循环可以直接循环出Array的索引。

Map:

  Map是一组键值对的结构,具有极快的查找速度。
  由于一个key只能对应一个value,所以,多次对一个key放入value,后面的值会把前面的值冲掉。
  var m = new Map([[‘Michael‘, 95], [‘Bob‘, 75], [‘Tracy‘, 85]]);
  m.get(‘Michael‘); // 95

  var m = new Map(); // 空Map
  m.set(‘Adam‘, 67); // 添加新的key-value
  m.set(‘Bob‘, 59);
  m.has(‘Adam‘); // 是否存在key ‘Adam‘: true
  m.get(‘Adam‘); // 67
  m.delete(‘Adam‘); // 删除key ‘Adam‘
  m.get(‘Adam‘); // undefined

Set:
  Set和Map类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在Set中,没有重复的key。
  通过add(key)方法可以添加元素到Set中,可以重复添加,但不会有效果。
  通过delete(key)方法可以删除元素。
  var s1 = new Set(); // 空Set
  var s2 = new Set([1, 2, 3]); // 含1, 2, 3

iterable:

遍历Array可以采用下标循环,遍历Map和Set就无法使用下标。为了统一集合类型,ES6标准引入了新的iterable类型,Array、Map和Set都属于iterable类型。
具有iterable类型的集合可以通过新的for ... of循环来遍历。

    var a = [‘A‘, ‘B‘, ‘C‘];
    a.name = ‘Hello‘;
    for (var x in a) {
        alert(x); // ‘0‘, ‘1‘, ‘2‘, ‘name‘
    }
for ... in循环将把name包括在内,但Array的length属性却不包括在内。 

for ... of循环则完全修复了这些问题,它只循环集合本身的元素。
    var a = [‘A‘, ‘B‘, ‘C‘];
    a.name = ‘Hello‘;
    for (var x of a) {
        alert(x); // ‘A‘, ‘B‘, ‘C‘
    }

更好的方式是直接使用iterable内置的forEach方法,它接收一个函数,每次迭代就自动回调该函数。

    var a = [‘A‘, ‘B‘, ‘C‘];
    a.forEach(function (element, index, array) {
        // element: 指向当前元素的值
        // index: 指向当前索引
        // array: 指向Array对象本身
        alert(element);
    });

Set与Array类似,但Set没有索引,因此回调函数的前两个参数都是元素本身:
    var s = new Set([‘A‘, ‘B‘, ‘C‘]);
    s.forEach(function (element, sameElement, set) {
        alert(element);
    });

Map的回调函数参数依次为value、key和map本身:
    var m = new Map([[1, ‘x‘], [2, ‘y‘], [3, ‘z‘]]);
    m.forEach(function (value, key, map) {
        alert(value);
    });
时间: 2024-11-05 22:56:34

JavaScript 精简笔记的相关文章

Javascript读书笔记:函数定义和函数调用

定义函数 使用function关键字来定义函数,分为两种形式: 声明式函数定义: function add(m,n) { alert(m+n); } 这种方式等同于构造一个Function类的实例的方式: var add = new Function("m", "n", "alert(m+n);"); Function类构造方法的最后一个参数为函数体:"alert(m+n);",前面的都是函数的形参,参数必须是字符串形式的:&

Javascript 学习笔记 2: 标识语句

可以在任何语句声明之前使用唯一标识(identifier)和冒号(:)用来标记该语句: identifier: statement 这样,你可以在程序的任何其他地方通过标识来使用这个语句.即使在语句内部也可以使用该语句的标识(例如:循环语句和条件语句).当在一个循环语句前添加一个标识,你可以在语句内部通过break 标识来退出当前循环,也可以通过continue标识来继续执行该语句.例如: mainloop: while(token != null) { // Code omitted... c

javascript学习笔记---ECMAScript-判断变量类型

判断类型之前,先要清楚有哪些类型. (理理思路:程序由数据和方法构成,数据由简单数据和复杂数据构成) 即类型有: 数据(简单数据:boolean,string,num,undefined,null.复杂数据:object), 方法(function) 万能的typeof,神一样的方法 typeof(1);// num typeof("hello");// string   typeof(false);// boolean var vFlag; typeof(vFlag);// unde

javascript进阶笔记(2)

js是一门函数式语言,因为js的强大威力依赖于是否将其作为函数式语言进行使用.在js中,我们通常要大量使用函数式编程风格.函数式编程专注于:少而精.通常无副作用.将函数作为程序代码的基础构件块. 在函数式编程中,有一种函数称为匿名函数,也就是没有名称的函数,是js中的一个非常重要的概念.通常匿名函数的使用情况是,创建一个供以后使用的函数.比如将匿名函数保存在一个变量里面,或将其作为一个对象方法,更有甚者将其作为一个回调等等之类的. //保存在变量中,通过fn去引用 var fn=function

javascript学习笔记---ECMAScript语法(引用类型)

引用类型通常叫做类(class). 本教程会讨论大量的 ECMAScript 预定义引用类型. 引用类型 引用类型通常叫做类(class),也就是说,遇到引用值,所处理的就是对象. 本教程会讨论大量的 ECMAScript 预定义引用类型. 从现在起,将重点讨论与已经讨论过的原始类型紧密相关的引用类型. 注意:从传统意义上来说,ECMAScript 并不真正具有类.事实上,除了说明不存在类,在 ECMA-262 中根本没有出现"类"这个词.ECMAScript 定义了"对象定

javascript学习笔记---ECMAScriptECMAScript 对象----定义类或对象

使用预定义对象只是面向对象语言的能力的一部分,它真正强大之处在于能够创建自己专用的类和对象. ECMAScript 拥有很多创建对象或类的方法. 原始的方式 因为对象的属性可以在对象创建后动态定义(后绑定),类似下面的代码: var oCar = new Object; oCar.color = "blue"; oCar.doors = 4; oCar.mpg = 25; oCar.showColor = function() { alert(this.color); };不过这里有一

Javascript 事件 笔记 1

HTML 事件处理程序: 缺点:html 和 js 耦合性太高 (如果改动方法名 那么就要改HTML 代码和JS代码 ) 优点: 兼容性强 1 <input type="button" id="btn1" value="btn1" onclick="alert(this.value)"> Dome 0 级事件处理程序: 把函数赋值给一个事件的属性. 简单,跨浏览器 1 var btn2 = document.get

javascript学习笔记---ECMAScriptECMAScript 对象----修改对象

通过使用 ECMAScript,不仅可以创建对象,还可以修改已有对象的行为. prototype 属性不仅可以定义构造函数的属性和方法,还可以为本地对象添加属性和方法. 创建新方法 通过已有的方法创建新方法Number.prototype.toHexString = function() { return this.toString(16); }; 在此环境中,关键字 this 指向 Number 的实例,因此可完全访问 Number 的所有方法.有了这段代码,可实现下面的操作: var iNu

javascript学习笔记——如何修改&lt;a href=&quot;#&quot;&gt;url name&lt;/a&gt;

0.前言 使用了一段时间javascript,再花了点时间学习了jquery,但是总是感觉自己很"迷糊",例如<a href="#">url name</a>中,如果修改href中的"#"应如何编写代码,如果修改url name应如何编写代码.再加上javascript和jquery操作方法略有不同,所以我就更"迷糊"了. [说明] 曾经使用关键词--"innerHTML和value区别&qu