数据类型
1.Number
JavaScript不区分整数和浮点数,统一用Number表示,以下都是合法的Number类型
123; // 整数123
0.456; // 浮点数0.456
1.2345e3; // 科学计数法表示1.2345x1000,等同于1234.5
-99; // 负数
NaN; // NaN表示Not a Number,当无法计算结果时用NaN表示
Infinity; // Infinity表示无限大,当数值超过了JavaScript的Number所能表示的最大值时,就表示为Infinity
2.字符串
1.字符串是以单引号'或双引号"括起来的任意文本
var aString = '原来我是字符串';
var anOtherString = "哎呦,我也是";
2.[1]如果'本身也是一个字符,那就可以用""括起来 [2]如果字符串内部既包含'又包含" ,可以用转义字符\来标识
var aString = "It's my cat";
var antherString = "\`";//[2]
3.[1]ASCII字符可以以\x##形式的十六进制表示 [2]Unicode字符可以以\u####的形式表示
var a = "\x41"; //[1] 等同于 ‘A’
console.log(a);
var b = '\u6C6A\u6C6A';//[2] 等同于‘汪汪’
console.log(b);
4.多行字符串用\n表示 ES6标准新增了一种多行字符串的表示方法,用
... 表示
var c = `第一行
第二行
第三行`;
console.log(c);//ES6才可以
5.模板字符串[1]要把多个字符串连接起来,可以用+号连接 [2]ES6使用${}
var cat = "cat";
var catAge = "1";
var message = "A"+ " " +cat +" "+ catAge;//[1]
console.log(message);
var cat = "cat";
var catName = "HelloKitty";
var message = `A ${cat} name is ${catName}`;//[2]注意必须使用"`"
console.log(message);
6.字符串操作
var a = "Hello! HelloKitty";
var theLength = a.length;//字符串长度17
console.log(theLength.toString());
var aChar = a[0];//H
console.log(aChar);//H
var anOtherChar = a[40];//不在索引范围内返回undefined
console.log(anOtherChar)//undefined
var b = "canChange?";
b[0] = "";//对字符串的某个索引赋值,不会有任何错误,但是,也没有任何效果
console.log(b);//canChange?
var c = b.toUpperCase();//把一个字符串全部变为大写
console.log(c);//CANCHANGE?
var d = b.toLowerCase();//把一个字符串全部变为小写
console.log(d);//canchange?
var e = b.indexOf("a")
console.log(e);//搜索指定字符串出现的位置只会是第一个
var f = b.indexOf("d");
console.log(f);//搜索不到返回-1
var g = b.substring(1);//从索引1开始到结束
console.log(g);
var h = b.substring(1,3);//从索引1开始到3(不包括3)
console.log(h);
var i = b.substr(1,3);//从索引1开始到3(包括3)
console.log(i);
3.布尔值
一个布尔值只有true、false两种值,要么是true,要么是false
var aBoolValue = ture;
4.比较运算符
JavaScript允许对任意数据类型做比较:
false == 0; // true
false === 0; // false
JavaScript有两种比较运算符:
① ==比较,它会自动转换数据类型再比较,很多时候,会得到非常诡异的结果
② ===比较,它不会自动转换数据类型,如果数据类型不一致,返回false,如果一致,再比较
判断NaN
使用函数isNaN()
函数;
判断浮点数是否相等Math.abs(1 / 3 - (1 - 2 / 3)) < 0.0000001; //ture
null表示一个“空”的值
undefined表示值未定义
5.数组
JavaScript的数组可以包括任意数据类型
var arr = [1, 2, 3.14, 'Hello', null, true];
arr[0]; // 返回索引为0的元素,即1
arr[5]; // 返回索引为5的元素,即true
arr[6]; // 索引超出了范围,返回undefined
或
var arrAnther = new Array(1, 2, 3); // 创建了数组[1, 2, 3]
1.直接直接给Array的length赋一个新的值会导致Array大小的变化
var aArry = [1, 2, 3.14, 'Hello', null, true];
console.log(aArry);
aArry.length = 10;//指定长度比原来大,会增加至指定长度增加的位置值为undefined
console.log(aArry);//[ 1, 2, 3.14, 'Hello', null, true, , , , ]
console.log(aArry[8]);//undefined
aArry.length = 3;//指定长度比原来小会截取掉超过指定长度之后的元素 ,小于0会报错
console.log(aArry);
2.Array可以通过索引把对应的元素修改为新的值
var anArry = ["1","2","3"];
//anArry[-1] = 3;下标指定小于0 不知道什么奇怪的结果😂
//console.log(anArry);
anArry[1] = "第一";//直接修改值
console.log(anArry);
anArry[5] = 5;//若果超过数组长度,则Arry的大小变化
console.log(anArry);
3.数组的操作
`1. indexOf`
var arryOne = ["第一", 20, '30', 'abc'];
console.log(arryOne.indexOf(20));//元素20的索引为1
console.log(arryOne.indexOf("ab"));//找不到返回-1
`2. sliceslice()就是对应String的substring()版本,它截取Array的部分元素,然后返回一个新的Array`
console.log(arryOne.slice(0,2));//从索引0开始,到索引2结束,但不包括索引2
//console.log(arryOne.slice(3,5)); 只要第一个参数>=数组最大索引,会报错
console.log(arryOne.slice());//参数不填,直接返回复制的相同的新数组
`3. push和pop push()向Array的末尾添加若干元素,pop()则把Array的最后一个元素删除掉`
arryOne.push("4",5);//最后一位开始添加元素
console.log(arryOne);
arryOne.pop();//没有参数,删除最后一位,空数组pop不会报错
console.log(arryOne);
`4. unshift和shift 如果要往Array的头部添加若干元素,使用unshift()方法,shift()方法则把Array的第一个元素删掉`
arryOne.unshift("我才是第一","第二");//头部添加若干元素
console.log(arryOne);
arryOne.shift();//删除第一个元素
console.log(arryOne);
`5. sort 对数组排序 会改变原数组的排序`
var arryTwo = arryOne.slice();
console.log(arryOne);
console.log(arryTwo);
`6. reverse 把整个Array 反转`
console.log(arryTwo.reverse());
`7. splice() 它可以从指定的索引开始删除若干元素,然后再从该位置添加若干元素:`
var arryThree = ["one","two",3,4];
arryThree.splice(1,2,"添加1","添加2","添加3");//从索引1开始开除2个元素,并添加元素若干
console.log(arryThree);
arryThree.splice(2, 2);//只删除不添加
console.log(arryThree);
arryThree.splice(2, 0,"添加4");//只添加不删除
console.log(arryThree);
`8. concat()方法把当前的Array和另一个Array连接起来,并返回一个新的Array:`
var arryFour = [1,2,3];
var arryFive = [4,5,6];
var newArry = arryFour.concat(arryFive);
console.log(newArry);
var anOtherNewArry = newArry.concat(7,8,9,[10,11,12]);//全部拆开再拼接
console.log(anOtherNewArry);
`9. join()方法是一个非常实用的方法,它把Array的每个元素用指定的字符串连接起来,然后返回连接后的字符串`
var arrySix = ['A', 'B', 'C', 1, 2, 3];
var aString = arrySix.join('^');
console.log(aString);
6.对象(😂。。对象)
var aDog = {
name: '单身狗',
age: '保密',
tags: ['性格好', '知书达理','😂','自己脸都红了'],
city: 'Shanghai',
form: '江苏',
hasCar: false,
zipcode: null,
'ha-ha':"^_^"
};
1. 访问属性是通过.操作符完成的,但这要求属性名必须是一个有效的变量名。如果属性名包含特殊字符,就必须用''括起来:
console.log(aDog.zipcode);
console.log(aDog.name);
console.log(aDog['ha_ha']);
2. 访问不存在的属性不报错,而是返回undefined
console.log(aDog.ddddd);
3. JavaScript的对象是动态类型,你可以自由地给一个对象添加或删除属性:
aDog.girlFriendName = "null";
console.log(aDog.girlFriendName);
delete aDog.age;//删除属性
console.log(aDog.age);//存在的属性打印为undefined
4. 如果要检测对象是否拥有某一属性,可以用
in操作符或函数
hasOwnProperty``
console.log('age' in aDog);//in是判断自身或继承来的父类是否有这个属性
console.log(aDog.hasOwnProperty('name'));
console.log(aDog.hasOwnProperty('toString'));//hasOwnProperty是判断自身拥有
7.Map[ES6]
JavaScript的默认对象表示方式{}可以视为其他语言中的Map或Dictionary的数据结构,即一组键值对。
但是JavaScript的对象有个小问题,就是键必须是字符串。但实际上Number或者其他数据类型作为键也是非常合理的。
为了解决这个问题,最新的ES6规范引入了新的数据类型Map
1. [1]初始化Map需要一个二维数组 或者[2]直接初始化一个空Map
var m = new Map([['Me', 95], ['him', 75], ['her', 85]]);//[1]
m.get('Me'); // 95
var m = new Map();
m.set('Me1', 67);
m.set('Her1', 88);
m.get('Me1'); // 88
8.Set
Set和Map类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在。
要创建一个Set,需要提供一个Array作为输入,或者直接创建一个空Set:
1. [1]直接创建一个空Set 或[2]使用一个Array初始化
var s1 = new Set(); // 空Set
var s2 = new Set([1, 2, 3]); // 含1, 2, 3
s1.add("我是一个元素");//添加
s2.delete(2);//删除2
console.log(s1);
console.log(s2);
2. Set中,没有重复的key
var aSet = new Set([1]);
aSet.add(1);
console.log(aSet);
9.iterable
遍历Array可以采用下标循环,遍历Map和Set就无法使用下标。ES6标准引入了新的iterable类型,Array、Map和Set都属于iterable类型。
1. 具有iterable类型的集合可以通过新的for ... of循环来遍历
var a = ['A', 'B', 'C'];
a.name = 'Hello';
for (var x in a) {
console.log(x); // '0', '1', '2', 'name'包含属性
}
//for of
for (var x of a) {
console.log(x);//只有 A B C 属性不包含在内
}
//iterable内置的forEach方法
a.forEach(function (element, index, array) {
// element: 指向当前元素的值
// index: 指向当前索引
// array: 指向Array对象本身
console.log(element);
});
10.变量
可以把任意数据类型赋值给变量,同一个变量可以反复赋值,而且可以是不同类型的变量
- strict模式
如果一个变量没有通过var申明就被使用,那么该变量就自动被申明为全局变量:
在同一个页面的不同的JavaScript文件中,如果都不用var申明,恰好都使用了变量i,将造成变量i互相影响,产生难以调试的错误结果。
使用var申明的变量则不是全局变量,它的范围被限制在该变量被申明的函数体内,同名变量在不同的函数体内互不冲突。
为了修补JavaScript这一严重设计缺陷,ECMA在后续规范中推出了strict模式,在strict模式下运行的JavaScript代码,强制通过var申明变量,未使用var申明变量就使用的,将导致运行错误。
启用strict模式的方法是在JavaScript代码的第一行写上:'use strict';
这是一个字符串,不支持strict模式的浏览器会把它当做一个字符串语句执行,支持strict模式的浏览器将开启strict模式运行JavaScript。