这个变量是一个动态类型,可以在多个类型中转换
JS只用一种数字类型,数字可以带小数点,可以不带。
数字
极大极小的数字可以通过科学计数法书写。
示例:
var y=123e5 //12300000 var z=123e-5 //0.00123
布尔型
JS数组
如何创建数组
var cars=new Array();
cars[0]="Audi";
cars[1]="BMW";
cars[2]="Volvo";
或者
var cars=new Array("Audi","BMW","Volvo");
或者
var cars=["Audi','BMW","Volvo"];
可以通过索引的length赋值来导致array的大小变化:
var arr = [1, 2, 3];
arr.length; //3
arr.length = 6;
arr; //[1, 2, 3, undefined, undefined, undefined]
arr.length = 2;
arr; // arr现在变为['A', 99, 'C']
如果通过索引赋值时,索引超过了范围,同样会引起Array
大小的变化:
var arr = [1, 2, 3];
arr[5] = 'x';
arr; // [1, 2, 3, undefined, 'x']
也可以用indexOf来搜索一个指定元素的位置:
var arr = [10, 20, '30', 'xyz'];
arr.indexOf(10); // 元素10的索引为0
arr.indexOf(20); // 元素20的索引为1
arr.indexOf(30);// 元素30没有找到,返回-1
当元组中有多个相同元素时,该方法只能查找到第一个元素所在的位置。
slice()
是对应string的substring()
版本, 它截取Array
的部分元素,然后返回一个新的Array
:
var arr = ['A', 'B', 'C', 'D', 'E', 'F'];
arr.slice(0,3); //从索引0开始到索引3介绍,但不包括索引3
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 === arr; // false
注意复制的对象并非它本身。
push和pop
push()
向Array
的末尾添加若干元素,pop()
则把Array
的最后一个元素删掉:
var arr = [1, 2];
arr.push('A', 'B');// 返回Array新的长度:4
arr.pop();
arr.pop(); arr.pop(); arr.pop();
arr;// []
arr.pop(); //空数组继续pop不会报错,而是返回undefined
arr; // []
而如果要在头部加元素,可以使用arr.unshift()
方法,删除第一个元素则是arr.shift()
。
sort
sort()
可以对当前Array进行排序, 它会直接修改当前Array的元素位置,直接调用时,按照默认顺序排序:
var arr = ['B', 'C', 'A'];
arr.sort();
arr;//['A', 'B', 'C']
reverse
如果要反转整个arr,可以使用arr.reverse()
。
splice
这是修改Array的万能方法。它允许从指定的索引开始删除若干元素,然后再从该位置添加若干元素:
var arr = ['Microsoft' , 'Apple', 'Yahoo', 'AOL', 'Excite', 'Oracle'];
//从索引2开始删除3个元素,再添加两个元素
arr.splice(2, 3, 'Google', 'Facebook'); // 返回删除的元素['Yahoo', 'AOL', 'Exicite']
arr; //['Microsoft', 'Apple', 'Google', 'Facebook', 'Oracle']
//只删除
arr.splice(2,2);
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拆开,然后全部添加到新的Array里:
var arr = ['A', 'B', 'C'];
arr.concat(1, 2, [3, 4]);// ['A', 'B', 'C', 1, 2, 3, 4]
join()方法是一个非常实用的方法,它把当前Array的每个元素都用指定的字符串连接起来,然后返回连接后的字符串:
var arr = ['A', 'B', 'C', 1, 2, 3];
arr.join('-'); // 'A-B-C-1-2-3'
如果array的元素不是字符串,将自动转换为字符串后再连接。
JavaScript也支持多维数组
JS对象
对象由花括号分割。在括号内部,对象的属性以名称和值对的形式(name:value)来定义,属性由逗号分割:
var person={firstname:"Bill", lastname:"Gates", id:5566};
该对象有三个属性,空格和折行无关紧要,声明可以横跨多行。
对象属性有两种寻址方式:
name=person.lastname;
name=person["lastname"];
对象的属性也可以用这种方式定义
var xiaoming = {
name: '小红’,
'middle-school': 'No.1 Middle School'
};
其中第二个属性名 middle-school 不是一个有效的变量,就需要用 ‘’ 括起来。访问这个属性也无法使用.操作符,必须用[‘xxx’]来访问:
事实上,JS中的对象所有的属性都是字符串,不过属性对应的值可以使任意数据类型。
如果访问不存在的属性,JS也不会报错,只会返回undefine
。
JS中,属性是可以动态添加或删除的:
var xiaoming = {
name: '小明’
};
xiaoming,age; //undefine
xiaoming.age = 18;
xiaoming.age; // 18
delete xiaoming.age;
xiaoming.age; //undefine
delete xiaoming['name'];
xiaoming.name; // undefine
delete xiaoming.school; //删除一个不存在的school属性,也并不会报错
可以使用in 来判断一个属性是否存在:
var xiaoming = {
name: '小明’,
birth:1990
};
'name' in xiaoming; //true
‘grade’ in xiaoming; //false
但是需要注意的是,in判断一个属性存在,但不一定是小明的,也有可能是小明继承得到的。
‘toString’ in xiaoming; // true
因为toString
定义在object对象中,所有对象都会在原型链上指向object
,所以小明也拥有toString属性
如果要判断一个属性是否自身拥有而非继承得到,可以用hasOwnProperty()
方法:
var xiaoming = {
name: '小明’
};
xiaoming.hasOwnProperty('name'); // true
xiaoming.hasOwnProperty('toString'); // false
Undefined & Null
Undefined 这个值表示变量不含有值。
可以通过将变量的值设置为null来清空变量
cars = null;
person = null;
声明变量类型
当创建新变量时,可以用关键词new来声明其类型(意义在哪里?)
var carname= new String;
var x= new Number;
var y= new Boolean;
var cars= new Array;
var Person= new Object;
JS变量均为对象。当您声明一个变量时,就创建了一个新的对象。
对象
JS中所有的事物都是对象:字符串、数字、数组、日期等。在JS中,对象是拥有属性和方法的数据。
属性和方法
属性是与对象相关的值。
方法是能够在对象上执行的动作。
比如car.name=Fiat
是汽车的属性
car.start()
是汽车的方法。
JS中的对象
var txt = "Hello"
在声明这样一个变量时,实际上已经创建了一个JS字符串对象。字符串对象拥有内建的属性length。对于上面的字符串来说,length的值为5.字符串对象同时拥有若干个内建的方法。
属性:
txt.length=5
方法:
txt.indexOf()
txt.replace()
txt.search()
在面向对象的语言中,属性和方法被称为对象的成员。
创建一个JS对象
JS中几乎所有事务都是对象:字符串、数字、数组、日期、函数,等等。
也可以创建自己的对象,如下:
person=new Object();
person.firstname="Bill";
person.lastname="Gates";
person.age=56;
person.eyecolor="blue";
访问对象的属性与方法
访问对象的属性
var x=message.length;
访问对象的方法
var x=message.toUpperCase();
在面向对象的语言中,一般不会用some_method()的语法标记,而是用someMethod()这样标记函数
var 声明的意义
不使用var声明的变量,如果直接对其赋值,将会自动被申明为全局变量。在同一个页面内,如果注入多个不同的javascript代码,如果多个代码中有相同名称的全局变量,将会产生难以调试的错误。因此ECMA在后续规范中推出了strict模式。在该模式下运行的JS代码,强制通过var申明变量,否则将导致运行错误。
使用strict模式的方法为,在第一行写上:
'use strict';
字符串
转义字符\可以转义很多字符,比如\n
表示换行,\t
表示制表等。ASCII字符可以以\x##
形式的十六进制表示,比如:
'\x41' ; //完全等同于‘A’
也可以用\u###
来表示一个Unicode字符。
由于多行字符串一直写\n比较费事,所以ES6新增了`符号来表示多行字符串
`这是
一个多行
字符串`;
模板字符串
以前的多个字符串要连接起来,可以用+好,但是 太麻烦
ES6新增了一种模板字符串,表示方法和上面的多行字符串一样的,但是它会自动替换字符串中的变量:
var name = '小明’ ;
var age = 20;
var message = `你好,${name}, 你今年${age}岁了!`;
alert(message);
字符串的操作
var s = 'Hello, world!';
s.length; // 13
s[6];//' '
所以字符串的操作其实可以和数组类似,但是如果想对字符串的某个索引赋值,不会报错,但不会有任何效果,因为字符串是不可变的
toUpperCase
把一个字符串全部变为大写:
var s = 'Hello';
s.toUpperCase();
toLowerCase
把一个字符串全部变为小写
indexOf
indexOf() 会搜索指定字符串出现的位置:
var s = 'hello, world';
s.indexOf('world'); // 返回7
s.indexOf('World'); // 没有找到指定的子串,返回-1
substring
substring() 返回指定索引区间的子串
var s = 'hello,world'
s.substring(0, 5); // 从索引0到5(不包括5),返回‘hello’
s.substring(7); //从索引7到结束,返回‘world’