JavaScript数据类型

在JavaScript中定义了以下两种数据类型:

  • 字符串(String)
  • 数字(Number)
  • 布尔(Boolean)
  • 数组(Array)
  • 对象(Object)
  • 空(Null)
  • 未定义(Undefined)

1. 字符串

字符串是以单引号’或双引号”括起来的即兴文本:

var carname="Volvo XC60";
var carname='Volvo XC60';

如果'本身也是1个字符,那就能够用""括起来:

var answer="It's alright";

如果"自家也是多个字符,那就足以用''括起来:

var answer='He is called "Johnny"';

借使字符串内部既涵盖'又包含"如何是好?能够用转义字符\来标识,比如:

'I\'m \"OK\"!';

转义字符\能够转义很多字符,比如\n意味着换行,\t意味着制表符,字符\本身也要转义,所以\\表示的字符正是\

多行字符串

鉴于多行字符串用\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);

 

操作字符串

length

得到字符串长度

var s = 'Hello, world!';
s.length; // 13

 

要赢得字符串有个别钦命地点的字符,使用类似Array的下标操作,索引号从0初阶:

var s = 'Hello, world!';

s[0]; // 'H'
s[6]; // ' '
s[7]; // 'w'
s[12]; // '!'
s[13]; // undefined 超出范围的索引不会报错,但一律返回undefined

亟待尤其注意的是,字符串是不可变的,若是对字符串的某部索引赋值,不会有其余错误,不过,也从未别的成效:

var s = 'Test';
s[0] = 'X';
alert(s); // s仍然为'Test'

JavaScript为字符串提供了有的常用方法,注意,调用那些方法本人不会变动原有字符串的剧情,而是再次回到2个新字符串:

toUpperCase

toUpperCase()把三个字符串全体成为大写:

var s = 'Hello';
s.toUpperCase(); // 返回'HELLO'

toLowerCase

toLowerCase()把一个字符串全体化为小写:

var s = 'Hello';
var lower = s.toLowerCase(); // 返回'hello'并赋值给变量lower
lower; // 'hello'

 

indexOf

indexOf()会招来指定字符串出现的职位:

var s = 'hello, world';
s.indexOf('world'); // 返回7
s.indexOf('World'); // 没有找到指定的子串,返回-1

 

lastIndexOf

lastIndexOf()从字符串底部向尾部搜索钦定字符:

var s = 'hello';
s.lastIndexOf('l');   //返回 3

substr

substr()截取字符串:

var s = 'hello';
s.substr(1,2); //返回 ‘el’
// 从索引1开始截取长度为2的字符串

substring

substring()归来钦赐索引区间的子串:

var s = 'hello, world'
s.substring(0, 5); // 从索引0开始到5(不包括5),返回'hello'
s.substring(7); // 从索引7开始到结束,返回'world'

trim

trim()去除字符串两边空格:

var s = ' hello ';
s.trim();   //返回 ‘hello’

 

charAt

charAt()获取钦命地方字符:

var s = 'hello';
s.charAt(1);   //返回 ‘e’

 

match和search

match()重临匹配字符串的数组,固然没有匹配则赶回null

search()再次回到匹配字符串的首字符地点索引:

var str1="welcome to the world of world JS!";
var str2=str1.match("world");
var str3=str1.search("world");
alert(str2[0]);  // 结果为"world"
alert(str3);     // 结果为15

 

slice

slice(),对字符串进行切开操作:

var str1="abcdefgh";
var str2=str1.slice(2,4);   //结果为"cd",从索引2开始,截取到索引4,不包含索引4
var str3=str1.slice(4);     //结果为"efgh",从索引4开始,截取到字符串末尾
var str4=str1.slice(2,-1);  //结果为"cdefg",从索引2开始,截取到字符串末尾,不包含末尾字符
var str5=str1.slice(-3,-1); //结果为"fg",从索引-3开始,截取到字符串末尾索引-1,不包含末尾字符

 

replace

replace(),替换字符串:

var s = 'hello,jack';
s.replace('jack', 'michael');   //返回‘hello,michael’

 

split

split(),分割字符串:

var str1="一,二,三,四,五,六,日";
var strArray=str1.split(",");   //返回数组:["一", "二", "三", "四", "五", "六", "日"]

2. 数字(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

图片 1

处理器由于采用二进制,所以,有时候用十六进制表示整数比较方便,十六进制用0x前缀和0-9,a-f代表,例如:0xff000xa5b4c3d2,等等,它们和十进制表示的数值完全一样。

2进制: 1111 0011 1101 0100   <-----> 16进制:0xF3D4 <-----> 10进制:62420
2进制: 1 111 001 111 010 100 <-----> 8进制:0171724

 

3. 布尔值(Boolean)

布尔值和布尔代数的象征完全一致,二个布尔值唯有truefalse两种值,要么是true,要么是false,能够平昔用truefalse代表布尔值,实际运算中true=1,false=0,也得以通过布尔运推断算出来:

true; // 这是一个true值
false; // 这是一个false值
2 > 1; // 这是一个true值
2 >= 3; // 这是一个false值

 

4. 数组(Array)

a. 定义数组

数组是一组按顺序排列的会面,集合的种种值称为要素。JavaScript的数组能够回顾私下数据类型。例如:

[1, 2, 3.14, 'Hello', null, true];

上述数组包涵5个要素。数组用[]表示,元素之间用,分隔。

另一种成立数组的格局是经过Array()函数完成:

new Array(1, 2, 3); // 创建了数组[1, 2, 3]

可是,出于代码的可读性考虑,强烈建议直接利用[]

数组的因素得以因此索引来访问。请小心,索引的早先值为0

var arr = [1, 2, 3.14, 'Hello', null, true];
arr[0]; // 返回索引为0的元素,即1
arr[5]; // 返回索引为5的元素,即true
arr[6]; // 索引超出了范围,返回undefined

b. 数组的习性和方法

要取得Array的长短,直接访问length属性:

var arr = [1, 2, 3.14, 'Hello', null, true];
arr.length; // 6

请注意,直接给Arraylength赋二个新的值会促成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']

 

请注意,即使由此索引赋值时,索引当先了限制,同样会唤起Array大小的转变:

var arr = [1, 2, 3];
arr[5] = 'x';
arr; // arr变为[1, 2, 3, undefined, undefined, 'x']

多数其余编制程序语言不容许直接改动数组的轻重缓急,越界访问索引会报错。然则,JavaScript的Array却不会有其余错误。在编写制定代码时,不提出直接改动Array的大小,访问索引时要保证索引不会越界。

indexOf

与String类似,Array也足以通过indexOf()来搜寻贰个点名的元素的岗位:

var arr = [10, 20, '30', 'xyz'];
arr.indexOf(10); // 元素10的索引为0
arr.indexOf(20); // 元素20的索引为1
arr.indexOf(30); // 元素30没有找到,返回-1
arr.indexOf('30'); // 元素'30'的索引为2

 

slice

slice()便是对应String的substring()版本,它截取Array的一对因素,然后重回3个新的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()的起止参数包蕴起始索引,不包涵截至索引。

一旦不给slice()传送任何参数,它就会持久截取全部因素。利用那或多或少,我们得以很不难地复制1个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和pop

push()向Array的末梢添加若干因素,pop()则把Array的尾声叁个元素删除掉:

var arr = [1, 2];
arr.push('A', 'B'); // 返回Array新的长度: 4
arr; // [1, 2, 'A', 'B']
arr.pop(); // pop()返回'B'
arr; // [1, 2, 'A']
arr.pop(); arr.pop(); arr.pop(); // 连续pop 3次
arr; // []
arr.pop(); // 空数组继续pop不会报错,而是返回undefined
arr; // []

unshift和shift

就算要往Array的底部添加若干成分,使用unshift()方法,shift()办法则把Array的第2个成分删掉:

var arr = [1, 2];
arr.unshift('A', 'B'); // 返回Array新的长度: 4
arr; // ['A', 'B', 1, 2]
arr.shift(); // 'A'
arr; // ['B', 1, 2]
arr.shift(); arr.shift(); arr.shift(); // 连续shift 3次
arr; // []
arr.shift(); // 空数组继续shift不会报错,而是返回undefined
arr; // []

sort

sort()能够对脚下Array进展排序,它会直接改动当前Array的成分地方,直接调用时,根据暗中认可顺序排序:

var arr = ['B', 'C', 'A'];
arr.sort();
arr; // ['A', 'B', 'C']

对数字成分进行sort时,会产出未真正依照数字大小排序的状态:

arr=[1,5,2,100];
arr.sort();
console.log(arr)    // 排序结果:[1, 100, 2, 5]
//这是因为默认以字符的ASCII码进行排序,首字符相同,则比较第2位。故并没有按照数字的真实大小进行排序

 

缓解方法:

arr=[1,5,2,100];
function intSort(a,b){
    if (a>b){
        return 1;
    }
    else if(a<b){
        return -1;
    }
    else {
        return 0
    }
}

arr.sort(intSort);

console.log(arr)    // 排序结果:[1, 2, 5, 100]

//intSort函数也可写为如下形式
//function intSort(a,b){
//    return a-b;
//}

reverse

reverse()把整个Array的成分给反转:

var arr = ['one', 'two', 'three'];
arr.reverse(); 
arr; // ['three', 'two', 'one']

 

splice

splice()方法是修改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

concat()方法把当下的Array和另一个Array连接起来,并回到1个新的Array

var arr = ['A', 'B', 'C'];
var added = arr.concat([1, 2, 3]);
added; // ['A', 'B', 'C', 1, 2, 3]
arr; // ['A', 'B', 'C']

请注意concat()办法并不曾改动当前Array,而是回到了2个新的Array

实际上,concat()格局能够收到任意个因素和Array,并且自动把Array拆开,然后全体添加到新的Array里:

var arr = ['A', 'B', 'C'];
arr.concat(1, 2, [3, 4]); // ['A', 'B', 'C', 1, 2, 3, 4]

join

join()方法是贰个要命实用的章程,它把当前Array的每一种成分都用钦命的字符串连接起来,然后回来连接后的字符串:

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

如果Array的要素不是字符串,将自行转换为字符串后再连接。

5. 对象(Object) 

JavaScript的指标是一组由键-值组成的冬季聚集,例如:

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

JavaScript对象的键都以字符串类型,值能够是随机数据类型。上述person目的一共定义了多少个键值对,在那之中各类键又称为对象的习性,例如,personname属性为'Bob'zipcode属性为null

要拿走一个指标的性质,我们用对象变量.属性名的方式:

person.name; // 'Bob'
person.zipcode; // null

做客属性是经过.操作符落成的,但那供给属性名必须是2个实用的变量名。假使属性名包括特殊字符,就不能够不用''括起来:

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

xiaohong的属性名middle-school不是1个一蹴而就的变量,就须要用''括起来。访问那天性情也不可能使用.操作符,必须用['xxx']来访问:

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

也得以用xiaohong['name']来访问xiaohongname属性,不过xiaohong.name的写法更简短。大家在编写JavaScript代码的时候,属性名尽量使用正式的变量名,那样就能够间接通过object.prop的款型拜访三个天性了。

实际JavaScript对象的有所属性都以字符串,可是属性对应的值能够是任意数据类型。

设若访问叁个不设有的特性会回来什么呢?JavaScript规定,访问不存在的属性不报错,而是回到undefined

var xiaoming = {
    name: '小明'
};
xiaoming.age; // undefined

鉴于JavaScript的靶子是动态类型,你能够任意地给2个目的添加或删除属性:

var xiaoming = {
    name: '小明'
};
xiaoming.age; // undefined
xiaoming.age = 18; // 新增一个age属性
xiaoming.age; // 18
delete xiaoming.age; // 删除age属性
xiaoming.age; // undefined
delete xiaoming['name']; // 删除name属性
xiaoming.name; // undefined
delete xiaoming.school; // 删除一个不存在的school属性也不会报错

万一大家要检测xiaoming是或不是具有某一品质,能够用in操作符:

var xiaoming = {
    name: '小明',
    birth: 1990,
    school: 'No.1 Middle School',
    height: 1.70,
    weight: 65,
    score: null
};
'name' in xiaoming; // true
'grade' in xiaoming; // false

可是要小心,借使in看清三天性能存在,这么些个性不自然是xiaoming的,它也许是xiaoming继承取得的:

'toString' in xiaoming; // true

因为toString定义在object目的中,而持有指标最后都会在原型链上指向object,所以xiaoming也拥有toString属性。

要判断两性子质是不是是xiaoming本人持有的,而不是一连取得的,能够用hasOwnProperty()方法:

var xiaoming = {
    name: '小明'
};
xiaoming.hasOwnProperty('name'); // true
xiaoming.hasOwnProperty('toString'); // false

6. Null & Undefined类型

Undefined类型

Undefined 类型唯有多少个值,即
undefined。当证明的变量未初叶化时,该变量的暗中认可值是 undefined。

当函数无分明重返值时,重回的也是值 “undefined”;

Null类型

另一种唯有贰个值的项目是 Null,它唯有二个专用值 null,即它的字面量。值
undefined 实际上是从值 null 派生来的,因而 ECMAScript
把它们定义为相等的。

就算这七个值万分,但它们的意思差异。undefined
是声称了变量但未对其初阶化时予以该变量的值,null
则用于表示没有存在的对象(在探究 typeof
运算符时,不难地介绍过那一点)。假诺函数或艺术要回来的是目的,那么找不到该指标时,再次回到的通常是
null。

图片 2

 

参考资料:

1. http://www.w3cschool.cn/javascript/js-datatypes.html

2. http://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/001434499190108eec0bdf14e704a09935cd112e501e31a000

3. http://www.cnblogs.com/yuanchenqi/articles/6893904.html