文章目录
一、数据类型
数据类型:
- 数值(number):整数和小数(比如
1
和3.14
) - 字符串(string):文本(比如
Hello World
)。 - 布尔值(boolean):表示真伪的两个特殊值,即
true
(真)和false
(假) undefined
:表示“未定义”或不存在,即由于目前没有定义,所以此处暂时没有任何值null
:表示空值,即此处的值为空。- 对象(object):各种值组成的集合。
数值、字符串、布尔值这三种类型,合称为原始类型(primitive type)的值,即它们是最基本的数据类型,不能再细分了
var a;
a // undefined
x
// ReferenceError: x is not defined
var a = null;
a
// null
1.数值
1.数值范围
JavaScript 能够表示的数值范围为21024到2-1023(开区间)
正向溢出:即 JavaScript 无法表示这么大的数,这时就会返回Infinity
。
负向溢出:即 JavaScript 无法表示这么小的数,这时会直接返回0
2.特殊数值
NaN
是 JavaScript 的特殊值,表示“非数字”(Not a Number),主要出现在将字符串解析成数字出错的场合
3.全局方法
parseInt() 将任何参数转化为字符串,然后再转化为整数
parseFloat() 将一个字符串转为浮点数
isNaN() 来判断一个值是否为NaN
isFinite() 某个值是否为正常的数值
2.字符串
字符串可以被视为字符数组,因此可以使用数组的方括号运算符,用来返回某个位置的字符(位置编号从0开始)
var s = 'hello';
s[0] // "h"
s[1] // "e"
s[4] // "o"
Base64 转码
var string = 'Hello World!';
btoa(string) // "SGVsbG8gV29ybGQh"
atob('SGVsbG8gV29ybGQh') // "Hello World!"
3.对象
什么是对象?简单说,对象就是一组“键值对”(key-value)的集合,是一种无序的复合数据集合
对象则称为合成类型(complex type)的值,因为一个对象往往是多个原始类型的值的合成,可以看作是一个存放各种值的容器
object是最复杂的数据类型,又可以分成三个子类型。
-
狭义的对象(object)
-
数组(array)
-
函数(function)
(1).狭义的对象
对象的引用
不同的变量名指向同一个对象,那么它们都是这个对象的引用,也就是说指向同一个内存地址,修改其中一个变量,会影响到其他所有变量,取消某一个变量对于原对象的引用,不会影响到另一个变量
var o1 = {};
var o2 = o1;
o1.a = 1;
o2.a // 1
o2.b = 2;
o1.b // 2
这种引用只局限于对象,如果两个变量指向同一个原始类型的值。那么,变量这时都是值的拷贝。
表达式还是语句?
行首是大括号,一律解释为对象
eval('{foo: 123}') // 123 这是语句,表示代码区块
eval('({foo: 123})') // {foo: 123} 这是表达式,解释为对象
属性操作
var obj = {
p: 'Hello World'
};
obj['p'] //读取对象的属性,obj.p效果一样。方括号运算符内部还可以使用表达式
obj['bar'] = 'World'; //点运算符和方括号运算符,不仅可以用来读取值,还可以用来赋值
Object.keys(obj); //查看一个对象本身的所有属性
delete obj.p //删除对象的属性
'p' in obj //是否包含某个属性
var obj = {a: 1, b: 2, c: 3};
for (var i in obj) { //循环用来遍历一个对象的全部属性
console.log('键名:', i);
console.log('键值:', obj[i]);
}
with 语句
它的作用是操作同一个对象的多个属性
var obj = {
p1: 1,
p2: 2,
};
with (obj) {
p1 = 4;
p2 = 5;
}
with区块内部有变量的赋值操作,必须是当前对象已经存在的属性,否则会创造一个当前作用域的全局变量
(2).函数
(1)function 命令
function print(s) {
console.log(s);
}
(2)函数表达式
var print = function(s) {
console.log(s);
};
(3)Function 构造函数
var add = new Function(
'x',
'y',
'return x + y'
);
函数的属性和方法
属性名/方法名 | 作用 |
---|---|
name | 返回函数的名字 |
length | 返回函数定义之中的参数个数 |
toString() | 返回一个字符串,内容是函数的源码 |
闭包
如果出于种种原因,需要得到函数内的局部变量。正常情况下,这是办不到的,只有通过变通方法才能实现。那就是在函数的内部,再定义一个函数,子对象会一级一级地向上寻找所有父对象的变量
链式作用域"结构(chain scope)
function f1() {
var n = 999;
function f2() { //闭包就是函数
console.log(n);
}
return f2;
}
var result = f1();
result(); // 999
f1的返回值就是函数f2,由于f2可以读取f1的内部变量,所以就可以在外部获得f1的内部变量了。
IIFE
(function(){ /* code */ }());
// 或者
(function(){ /* code */ })();
不要让function出现在行首,让引擎将其理解成一个表达式,而不是函数定义语句
eval 命令
eval
命令接受一个字符串作为参数,并将这个字符串当作语句执行。val
没有自己的作用域,都在当前作用域内执行
eval('var a = 1;'); //参数:字符串参数、数字
a // 1
var a = 1;
eval('a = 2');
a // 2 // 修改了全局变量
(3).数组
数组(array)是按次序排列的一组值。每个值的位置都有编号(从0开始),整个数组用方括号表示。任何类型的数据,都可以放入数组
var arr = [
{a: 1},
[1, 2, 3],
function() {return true;}
];
arr[0] // Object {a: 1}
arr[1] // [1, 2, 3]
arr[2] // function (){return true;}
属性/方法 | 作用 |
---|---|
length | 返回数组的成员数量,也可以修改length的值用于修改数组的长度 |
in | 检查某个键名是否存在的运算符 |
for…in 循环和数组的遍历
var a = [1, 2, 3];
for (var key in a) {
console.log(key);
}
二、条件语句
1.if 结构
if (布尔值)
语句;
##2.if…else 结构
if (m === 0) {
// ...
} else if (m === 1) {
// ...
} else if (m === 2) {
// ...
} else {
// ...
}
3.switch 结构
var x = 1;
switch (x) {
case 1:
console.log('x 等于1');
break;
case 2:
console.log('x 等于2');
break;
default:
console.log('x 等于其他值');
}
4.三元运算符 ?
(条件) ? 表达式1 : 表达式2
var even = (n % 2 === 0) ? true : false; //果n可以被2整除,则even等于true,否则等于false
三、循环语句
1.while 循环
var i = 0;
while (i < 100) {
console.log('i 当前为:' + i);
i = i + 1;
}
2.for 循环
var x = 3;
for (var i = 0; i < x; i++) {
console.log(i);
}
3.do…while 循环
do {
console.log(i);
i++;
} while(i < x);
do...while循环与while循环类似,唯一的区别就是先运行一次循环体,然后判断循环条件
4.break 语句和 continue 语句
跳出代码块或循环
while(i < 100) {
console.log('i 当前为:' + i);
i++;
if (i === 10) break;
}
continue语句用于立即终止本轮循环
var i = 0;
while (i < 100){
i++;
if (i % 2 === 0) continue;
console.log('i 当前为:' + i);
}
5.标签
跳转到程序的任意位置
JavaScript 语言允许,语句的前面有标签(label),相当于定位符
top:
for (var i = 0; i < 3; i++){
for (var j = 0; j < 3; j++){
if (i === 1 && j === 1) break top; //直接跳出双层循环
console.log('i=' + i + ', j=' + j);
}
}
标签通常与break语句和continue语句配合使用,跳出特定的循环。
标签也可以用于跳出代码块
foo: {
console.log(1);
break foo;
console.log('本行不会输出');
}
continue语句也可以与标签配合使用
top:
for (var i = 0; i < 3; i++){
for (var j = 0; j < 3; j++){
if (i === 1 && j === 1) continue top;
console.log('i=' + i + ', j=' + j);
}
}
continue命令后面有一个标签名,满足条件时,会跳过当前循环