JavaScript数据类型

当JavaScript中定义了以下几栽多少类:

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

1. 字符串

字符串是盖单引号’或对引号”括起来的任性文本:

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

如果'自身也是一个字符,那就算足以据此""括起来:

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也字符串提供了部分常用方法,注意,调用这些点子本身不会见变动原字符串的情节,而是回到一个新字符串:

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];

上述数组包含6个元素。数组用[]代表,元素中为此,分隔。

别一样种创建数组的道是通过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的片段因素,然后回一个初的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()传送任何参数,它便见面持久截取所有因素。利用就一点,我们可生容易地复制一个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的首先只要素删掉:

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连接起来,并赶回一个初的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,而是返回了一个新的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目标一共定义了6只键值对,其中每个键又叫做对象的性能,例如,personname属性为'Bob'zipcode属性为null

而获取一个目标的特性,我们之所以对象变量.属性名的方式:

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

看属性是由此.操作符完成的,但就要求属性名必须是一个实惠之变量名。如果属性名包含特殊字符,就必用''括起来:

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

xiaohong的属于性名middle-school切莫是一个管用的变量,就用为此''满载起来。访问是特性也束手无策利用.操作符,必须用['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的对象是动态类型,你可轻易地被一个目标上加要去属性:

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