JavaScript基本语法

数据类型

  • js不区分证书和浮点数,统一用Number表示
    • NaN表示Not a Number。当无法计算结果是用NaN表示
    • Infinity表示无限大,当数值超过了JavaScript的Number所能表示的最大值时,就表示为Infinity
  • 字符串是以单引号’或双引号”括起来的任意文本
  • 布尔值和布尔代数的表示完全一致
  • ++==比较,它会自动转换数据类型再比较,很多时候,会得到非常诡异的结果;++
  • ++===比较,它不会自动转换数据类型,如果数据类型不一致,返回false,如果一致,再比较++
  • 另一个例外是NaN这个特殊的Number与所有其他值都不相等,包括它自己:唯一能判断NaN的方法是通过isNaN()函数:isNaN(NaN); // true
  • null表示一个“空”的值

- undefined表示“未定义”。

- 数组是一组按顺序排列的集合,集合的每个值称为元素。JavaScript的数组可以包括任意数据类型。
- 另一种创建数组的方法是通过Array()函数实现:new Array(1, 2, 3); // 创建了数组[1, 2, 3]
- 与C的数组一样,JavaScript的数组亦可随机访问

对象

  • JavaScript的对象是一组由键-值组成的无序集合,类似于C中的结构体
  • 申明一个变量用var语句。如果一个变量没有通过var申明就被使用,那么该变量就自动被申明为全局变量:
  • 同一个变量可以反复赋值,而且可以是不同类型的变量,但是要注意只能用var申明一次

strict模式

  • 如果都不用var申明,恰好都使用了变量i,将造成变量i互相影响,产生难以调试的错误结果。
  • 为了修补这一严重错误,ECMA字后续规范中推出了strict模式
  • 在strict模式下运行的JavaScript代码,强制通过var申明变量,未使用var申明变量就使用的,将导致运行错误。
  • 启用strict模式的方法是在JavaScript代码的第一行写上:’use strict’;

字符串

  • JavaScript的字符串就是用”或”“括起来的字符表示。如果’本身也是一个字符,那就可以用”“括起来
  • 如果字符串内部既包含’又包含”怎么办?可以用转义字符\来标识比如:
'I\'m \"OK\"!';
表示的字符串内容是:I'm "OK"!
  • 转义字符\类似于C中的\,在此不再过多阐述

多行字符串

  • 由于多行字符串用\n写起来比较费事,所以最新的ES6标准新增了一种多行字符串的表示方法,用反引号 ... 表示:
`这是一个
 多行
 字符串`;

模板字符串

  • 要把多个字符串连接起来,可以用+号连接:
var name = '小明';
var age = 20;
var message = '你好, ' + name + ', 你今年' + age + '岁了!';
alert(message);
  • 如果有很多变量需要连接,用+号就比较麻烦。ES6新增了一种模板字符串,表示方法和上面的多行字符串一样,但是它会自动替换字符串中的变量:
var name = '小明';
var age = 20;
var message = `你好, ${name}, 你今年${age}岁了!`;
alert(message);
  • 字符串是不可变的,如果对字符串的某个索引赋值,不会有任何错误,但是,也没有任何效果

JavaScript为字符串提供了一些常用方法,注意,调用这些方法本身不会改变原有字符串的内容,而是返回一个新字符串

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

数组

  • js的Array可以包含任意数据类型
  • 要取得Array的长度,直接访问length属性
    • 直接给Array的length赋一个新的值会导致Array大小的变化
var arr = [1, 2, 3];
arr.length; // 3
arr.length = 6;
arr; // arr变为[1, 2, 3, undefined, undefined, undefined]
arr.length = 2;
arr; // arr变为[1, 2]
  • Array可以通过索引把对应的元素修改为新的值,因此,对Array的索引进行赋值会直接修改这个Array
var arr = ['A', 'B', 'C'];
arr[1] = 99;
arr; // arr现在变为['A', 99, 'C']

对象

  • JavaScript的对象是一种无序的集合数据类型,它由若干键值对组成。
  • JavaScript用一个{…}表示一个对象,键值对以xxx: xxx形式申明,用,隔开。注意,最后一个键值对不需要在末尾加,,如果加了,有的浏览器(如低版本的IE)将报错。
  • 访问属性是通过”.”操作符完成的,但这要求属性名必须是一个有效的变量名。如果属性名包含特殊字符,就必须用”括起来
  • 也可以用xiaohong[‘name’]来访问xiaohong的name属性,不过xiaohong.name的写法更简洁

JavaScript对象的所有属性都是字符串,不过属性对应的值可以是任意数据类型

访问不存在的属性不报错,而是返回undefined

js的对象为动态类型,你可以自由地给一个对象添加或删除属性


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

条件判断

  • if…else:与C语法相同,在此不过多阐述
  • JavaScript把null、undefined、0、NaN和空字符串”视为false,其他值一概视为true

循环

  • 与C语法相同,一般来说数组长度可用”数组名.length“,直接引用
  • for循环的3个条件都是可以省略的,如果没有退出循环的判断条件,就必须使用break语句退出循环,否则就是死循环
  • for … in循环可以把一个对象的所有属性依次循环出来
var o = {
    name: 'Jack',
    age: 20,
    city: 'Beijing'
};
for (var key in o) {
    alert(key); // 'name', 'age', 'city'
}
  • 由于Array也是对象,而它的每个元素的索引被视为对象的属性,因此,for … in循环可以直接循环出Array的索引
var a = ['A', 'B', 'C'];
for (var i in a) {
    alert(i); // '0', '1', '2'
    alert(a[i]); // 'A', 'B', 'C'
}

++请注意,for … in对Array的循环得到的是String而不是Number,即,for…in循环便利的实际上跟是对象的属性名称++

  • 要过滤掉对象继承的属性,用hasOwnProperty()来实现
var o = {
    name: 'Jack',
    age: 20,
    city: 'Beijing'
};
for (var key in o) {
    if (o.hasOwnProperty(key)) {
        alert(key); // 'name', 'age', 'city'
    }
}
  • while & do…while 语句亦与C中语法相同,不做阐述

Map和Set

Map

  • JavaScript的默认对象表示方式{}可以视为其他语言中的Map或Dictionary的数据结构,即一组键值对
    • js的对象中,键必须为字符串。但事实上Number或其他数据类型作为键亦可。新的数据类型Map的引入解决了这一问题
  • Map是一组键值对的结构,具有极快的查找速度
    • Map适用于对应的信息,如根据同学名字查找对应的成绩,若用Array实现,则需要两个Array(一个名字一个成绩)。但若用Map,则只需一个,且根据名字直接查成绩。不仅如此,速度还不会下降
    • eg:
var m = new Map([['Michael', 95], ['Bob', 75], ['Tracy', 85]]);
m.get('Michael'); // 95
  • Map用法:
    • 变量名.set(‘Adam’,66); //添加新的key-value
    • 变量名.has(‘Adam’); //是否存在key’Adam’:true
    • 变量名.get(‘Adam’); //获取值(若key不存在则为undefined)
    • 变量名.delete(‘Adam’); //删除key’Adam’
    • Ps:++一个key只能对应一个value,所以,多次对一个key放入value,后面的值会把前面的值冲掉++

Set

  • Set和Map类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在Set中,没有重复的key。
  • 要创建一个Set,需要提供一个Array作为输入,或者直接创建一个空Set
  • 重复元素在Set中自动被过滤
  • Set用法:
    • 变量名.add(key) //添加元素到Set中
    • 变量名.delete(key) //删除元素

iterable

  • iterable的引入是为了解决Map、Set无法使用下标遍历的缺点
  • 具有iterable类型的集合可以通过新的for … of循环来遍历。用法如下
var a = ['A', 'B', 'C'];
var s = new Set(['A', 'B', 'C']);
var m = new Map([[1, 'x'], [2, 'y'], [3, 'z']]);
for (var x of a) { // 遍历Array
    alert(x);
}
for (var x of s) { // 遍历Set
    alert(x);
}
for (var x of m) { // 遍历Map
    alert(x[0] + '=' + x[1]);
}
  • for…in和for…of区别:
    • for … in循环遍历的实际上是对象的属性名称。一个Array数组实际上也是一个对象,它的每个元素的索引被视为一个属性。当我们手动给Array对象添加了额外的属性后,for … in循环将带来意想不到的意外效果:(for…in与for…of对比图)
var a = ['A', 'B', 'C'];
a.name = 'Hello';
for (var x in a) {
    alert(x); // '0', '1', '2', 'name'
}


var a = ['A', 'B', 'C'];
a.name = 'Hello';
for (var x of a) {
    alert(x); // 'A', 'B', 'C'
}
    • for…in将name包括在内,而Array的length属性却不包括在内
    • for…of则只循环集合本身的元素
  • 此处介绍一种更方便你的方法:iterable内置的forEach:
    • 它接收一个函数,每次迭代就自动回调该函数

      • -
    • Array:
var a = ['A', 'B', 'C'];
a.forEach(function (element, index, array) {
    // element: 指向当前元素的值
    // index: 指向当前索引
    // array: 指向Array对象本身
    alert(element);
});
    • Set:++Set与Array类似,但Set没有索引,因此回调函数的前两个参数都是元素本身++
var s = new Set(['A', 'B', 'C']);
s.forEach(function (element, sameElement, set) {
    alert(element);
});
    • Map:++Map的回调函数参数依次为value、key和map本身++
var m = new Map([[1, 'x'], [2, 'y'], [3, 'z']]);
m.forEach(function (value, key, map) {
    alert(value);
});

猜你喜欢

转载自blog.csdn.net/qq_38722097/article/details/76637405