ES5的数据类型:
类型 | 值 | 区别 | 注释 |
---|---|---|---|
Undefined | undefined | 基础数据类型 | |
Boolean | true/false | 基础数据类型 | True/False不是Boolean值 |
String | “somestring” | 基础数据类型 | |
Number | 2,3,11… | 基础数据类型 | |
Null | null | 基础数据类型 | |
Object | [object Object] | 引用数据类型 |
* 在ecmascript中函数即是对象,所以函数是属于对象数据类型。
undefined和null是特殊值,是用来描述“空值”。
console.log(typeof null); // object
/*至于这里为何返回object:从逻辑角度看,null代表一个空对象指针,所以会返回object。不建议深入探究。*/
console.log(undefined == null); // true
console.log(undefined === null); // false
/*实际上,undefined值是派生自null且都用来描述'空值',所以对他们进行相等性测试的是true。但是恒等(===)测试时,他们的类型不同所以会返回false*/
NaN(not a number)
NaN是一个特殊的值,称为不是一个数字的Number类型。
conosle.log(NaN == NaN); // false
// NaN和所有的值都不相等,包括自己。
字符串是不可变的
var lang = 'java';
lang = lang + 'script';
// 字符串一旦创建就不能改变。第二行改变了lang的值,但是其实是改变了lang对象指向的内存区域。
// 可以理解为第二行代码改变了lang变量的指向。如下图
字符串和数字比较
对于数字和字符串操作符来说,加号运算符和比较运算符的行为是有所不同的。
加号运算符更偏爱字符串,如果其中一个操作数是字符串的话,则进行字符串链接操作。
比较运算符则更偏爱数字,当且仅当两个操作数都是字符串的时候,才会进行字符串的比较。
console.log(1+3); // 加法 3
console.log(1+'3'); // 字符串连接 '13' 1转换为'1'
console.log('1' + '3'); // 字符串连接 '13'
console.log(3 > 11); // 数字的比较 fasle
console.log(3 > '11'); // 数字的比较 '11'转换为11 false
console.log('3' > '11'); // 字符串的比较 true
逻辑非运算符
var str = 'hello';
console.log(!str); // false
console.log(!!str); // true
var kongStr = '';
console.log(!kongStr); // true
console.log(!!kongStr); // false
// 使用一个!逻辑非运算符的时候,是将值转化为布尔值,在取反。
// 使用两个!!逻辑非运算符的时候,是将值转为化布尔值取法在取反,相当于进行Boolean()进行处理
流程控制语句
对于if语句括号里面的表达式,会自动隐式调用Boolean()方法进行判断,将表达式的值转换成布尔值。
if (条件表达式) {
} else if(条件表达式) {
} else {
}
// 在上述流程语句中,当条件表达式满足了其中一个条件的时候,便开始执行内部代码,而不会继续向下判断。详细见例子:
var result = 77;
// 第一种流程语句的写法结果为: 及格
if (result > 60) {
alert('及格');
} else if(result > 70) {
alert('中等');
} else if(result > 80) {
alert('良好')
}
// 第二种流程语句的写法结果为: 中等
if (result > 80) {
alert('良好');
} else if(result > 70) {
alert('中等');
} else if(result > 60) {
alert('及格')
}
封装函数动态累加(参数个数可变)
function sum() {
var result = 0;
for (var i=0, len=arguments.length; i<len; i++) {
sum += arguments[i];
}
return result;
}
*ES5中的函数是没有重载功能,重载:几个相同的函数名,但是参数不同的函数。
*在ES5中,如果函数名相同,在后面声明的函数会覆盖前面声明的函数。
数组常用方法
// 栈是一种数据后进先出的数据结构,栈方法: push()、pop()
var arr = [3,7,9,11,5];
console.log(arr.push(8)); // 6 返回数组长度,原数组改变[3,7,9,11,5,8]
console.log(arr.pop()); // 8 返回删除的元素 原数组为[3,7,9,11,5]
// 队列方法,是一种先进先出的数据结构。
var arr = [3,7,9,11,5];
console.log(arr.shift()); // 3 返回删除的元素,原数组为[7, 9, 11, 5]
console.log(arr.unshift(4)); // 5 返回数组长度,原数组为 [4, 7, 9, 11, 5]
sort()方法相关知识
// sort()方法的默认排序在数字排序上是存在问题的,其默认排序顺序是根据字符串Unicode码点
var arr = [10, 1, 0, 5, 15];
console.log(arr.sort()); // [0, 1, 10, 15, 5]
// 根据需求,常见的从小到大排序,或者从大到小排序
function compare(value1, value2) {
if (value1 < value2) {
return -1;
} else if(value1 > value2) {
return 1;
} else {
return 0;
}
}
var arr = [10, 1, 0, 5, 15];
console.log(arr.sort(compare)); // [0, 1, 5, 10, 15]
// 如果需要从大到小排序
console.log(arr.sort(compare).reverse()); // [15, 10, 5, 1, 0]
数据内存存储
栈内存和堆内存
- 栈内存: 基本类型的值(同时也保存着对象的指针)
- 堆内存: 引用类型的值 => 对象
基本类型值: Undefined、Null、Boolean、Number、String类型值,占据固定的大小,存放在栈内存中,按值访问。
引用类性质: 对象。对象的大小是不固定的,因此保存在堆内存中。但引用的地址大小是固定的,因此保存在栈内存中。当查某引用类型的值时,先从栈中读取内存地址,通过内存地址找到堆中的值,称为按引用访问。注:引用类型的复制,是将引用的地址复制过去,指向同一个对象。
检测浏览器是否存在flash插件
function hasPlugin(name) {
var name = name.toLowerCase();
for(var i = 0; i<navigator.plugins.length; i++) {
if (navigator.plugins[i].name.toLowerCase().indexOf(name) > -1) {
return true;
}
}
}
hasPlugin('flash');
获取节点
document.getElementsByTagName(); // 返回对象集合,不是数组 [object HTMLCollection]
document.getElementsByClassName(); // [object HTMLCollection]
document.getElementById(); // [object HTMLDIVElement]
document.getElementsByName(); // [object NodeList] 比较少用