JS笔记 1.快速入门

题外话

此系列文章以ES 6为标准,总结于廖雪峰老师的JavaScript教程


JS代码可以嵌在网页任何地方,通常都嵌到 ... 标签中。

1.1 基本语法

  • JavaScript的语法和Java语言类似,每个语句以 ; 结束,语句块用 {...} 。但是,JavaScript并不强制要求在每个语句的结尾加 ; ,浏览器中负责执行JavaScript代码的引擎会自动在每个语句的结尾补上 ;
  • JavaScript本身对嵌套的层级没有限制,但是过多的嵌套无疑会大大增加看懂代码的难度。遇到这种情况,需要把部分代码抽出来,作为函数来调用,这样可以减少代码的复杂度。
  • JavaScript严格区分大小写,如果弄错了大小写,程序将报错或者运行不正常。

1.2 数据类型和变量

1. number类型
JavaScript不区分整数和浮点数,统一用Number表示,举例如下,

123; // 整数

0.456; // 浮点数

1.2345e3; // 科学计数法表示1.2345x1000,等同于1234.5

-99; // 负数

NaN; // NaN表示Not a Number,当无法计算结果时用NaN表示

Infinity; // Infinity表示无限大,当数值超过了JavaScript的Number所能表示的最大值时,就表示为Infinity

2. string类型

  • 在ES6中,多行字符串写法为 反引号 表示。

  • 模板字符串中要把多个字符串连接起来,可以用 + 连接。

    var name = '小明';
    var age = 20;
    var message = `你好, ${name}, 你今年${age}岁了!`;
    
  • 操作字符串

    toUpperCase() 把一个字符串全部变为大写;
    toLowerCase 把一个字符串全部变为小写;
    indexOf 搜索指定字符串出现的位置;
    substring 返回指定索引区间的子串。

    //indexOf
    var s = 'hello, world';
    s.indexOf('world'); // 返回7
    s.indexOf('World'); // 没有找到指定的子串,返回-1
    
    //substring
    var s = 'hello, world'
    s.substring(0, 5); // 从索引0开始到5(不包括5),返回'hello'
    s.substring(7); // 从索引7开始到结束,返回'world'
    

3. boolean类型

4. null和undefined类型

  • null 表示一个“空”的值,它和 0 以及空字符串 '' 不同, 0 是一个数值, '' 表示长度为0的字符串,而 null 表示“空”。
  • undefined 仅仅在判断函数参数是否传递的情况下有用。

5. 数组

  • 数组是一组按顺序排列的集合,集合的每个值称为元素。JavaScript的数组可以包括任意数据类型,例如:

    [1, 2, 3.14, 'Hello', null, true];
    
  • 数组用 [] 表示,元素之间用 , 分隔。数组的元素可以通过索引来访问。请注意,索引的起始值为0。

  • 要取得Array的长度,直接访问length属性。

    如果直接给Array的length赋一个新的值会导致Array大小的变化。
    如果通过索引赋值时,索引超过了范围,同样会引起Array大小的变化。

  • 操作数组

    indexOf 搜索一个指定的元素的位置;
    slice()

    //slice()就是对应String的substring()版本,它截取Array的部分元素,然后返回一个新的Array
    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']
    
    //如果不给slice()传递任何参数,它就会从头到尾截取所有元素。利用这一点,我们可以很容易地复制一个Array
    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的元素给反转。

    splice()

    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,并且自动把Array拆开,然后全部添加到新的Array里。

    join() 把当前Array的每个元素都用指定的字符串连接起来,然后返回连接后的字符串。
    javascript var arr = ['A', 'B', 'C', 1, 2, 3]; arr.join('-'); // 'A-B-C-1-2-3'

6. 对象
JavaScript的对象是一组由键-值组成的无序集合,例如:

var person = {
    name: 'Bob',
    age: 20,
    tags: ['js', 'web', 'mobile'],
    city: 'Beijing',
    hasCar: true,
    zipcode: null
};

JavaScript对象的键都是字符串类型,值可以是任意数据类型。上述person对象一共定义了6个键值对,其中每个键又称为对象的属性。要获取一个对象的属性,我们用对象 变量.属性名 的方式:例如 person.name 的值为 Bob

访问属性是通过 . 操作符完成的,但这要求属性名必须是一个有效的变量名。如果属性名包含特殊字符,就必须用 '' 括起来,访问这个属性也无法使用 . 操作符,必须用 ['xxx'] 来访问。

var xiaohong = {
    name: '小红',
    'middle-school': 'No.1 Middle School'
};

xiaohong['middle-school']; // 'No.1 Middle School'
xiaohong['name']; // '小红'
xiaohong.name; // '小红'

如果我们要检测xiaoming是否拥有某一属性,可以用 in 操作符。不过要小心,如果in判断一个属性存在,这个属性不一定是xiaoming的,它可能是xiaoming继承得到的。要判断一个属性是否是xiaoming自身拥有的,而不是继承得到的,可以用 hasOwnProperty() 方法。

7. 变量
变量不仅可以是数字,还可以是任意数据类型。变量在JavaScript中就是用一个变量名表示,变量名是大小写英文、数字、$和_的组合,且不能用数字开头。变量名也不能是JavaScript的关键字,如 ifwhile 等。

同一个变量可以反复赋值,而且可以是不同类型的变量,但是要注意只能用var申明一次。

8. strict模式
ECMA在后续规范中推出了strict模式,在strict模式下运行的JavaScript代码,强制通过var申明变量,未使用var申明变量就使用的,将导致运行错误。

启用strict模式的方法是在JavaScript代码的第一行写上: use strict

9. 比较运算符
JavaScript在设计时,有两种比较运算符:

  • 第一种是 == 比较,它会自动转换数据类型再比较,很多时候,会得到非常诡异的结果;
  • 第二种是 === 比较,它不会自动转换数据类型,如果数据类型不一致,返回false,如果一致,再比较。

一个例外是 NaN 这个特殊的Number与所有其他值都不相等,包括它自己,即 NaN === NaN 判断结果为false。
唯一能判断NaN的方法是通过 isNaN() 函数,即 isNaN(NaN) 返回结果为true。

1.3 Map和Set

  • Map
    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 是一组key的集合,但不存储value,且key值不能重复。
    • 要创建一个Set,需要提供一个Array作为输入,或者直接创建一个空Set
      var s1 = new Set(); // 空Set
      var s2 = new Set([1, 2, 3]); // 含1, 2, 3
      s2.delete(3);
      

1.4 iterable

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

for ... in循环由于历史遗留问题,它遍历的实际上是对象的属性名称。一个Array数组实际上也是一个对象,它的每个元素的索引被视为一个属性。当我们手动给Array对象添加了额外的属性后,for ... in循环将带来意想不到的意外效果。for ... of循环则完全修复了这些问题,它只循环集合本身的元素

var a = ['A', 'B', 'C'];
a.name = 'Hello';
for (var x in a) {
    console.log(x); // '0', '1', '2', 'name'
}

for (var x of a) {
    console.log(x); // 'A', 'B', 'C'
}

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

你可能感兴趣的:(JS笔记 1.快速入门)