3.类型、值和变量
如果函数用来初始化(使用new运算符)一个新建对象,我们称之为构造函数
3.1 数字
js不区分整数值和浮点数值,所有数字均用浮点数值表示
// js中除了+(加)、-(减)、*(乘)、/(除)、%(取余)等进行数字运算外,还支持更加复杂的算术运算
// 这些复杂运算通过作为Math对象的属性定义的函数和常量来实现:
Math.pow(2,53) //=> 9007199254740992: 2的53次幂
Math.round(.6) //=> 1.0 四舍五入
Math.ceil(.6) //=> 1.0 向上求整
Math.floor(.6) //=> 0.0 向下求整
Math.abs(-5) //=> 5 求绝对值
Math.max(x,y,z) // 返回最大值
Math.min(x,y,z) // 返回最小值
Math.random() // 生成一个大于等于0小于1.0的伪随机数
Math.PI // π: 圆周率
Math.E // e: 自然对数的底数
Math.sqrt(3) // 3的平方根
Math.pow(3,1/3) // 3的立方根
Math.sin(0) // 三角函数:还有Math.cos,Math.atan等
Math.log(10) // 10的自然对数
Math.log(100)/Math.LN10 // 以10为底100的对数
Math.log(512)/Math.LN2 // 以2为底512的对数
Math.exp(3) // e的三次幂
(以上仅为Math对象的一部分)
非数字值NaN:0除以0,或者无穷大除以无穷大、给任负数做开方运算或者算术运算符与不是数字或者无法转换为数字的操作数一起使用时都将返回NaN
非数字值有一点特殊:他和任何值都不相等,包括自身。即,没办法通过x==NaN来判断变量x是否是NaN。
var x = NaN;
console.log(x == NaN); // => false
应该用x!=NaN来判断,当且仅当x为NaN的时候,表达式结果为true。函数isNaN()的作用与此类似,如果参数是NaN或者一个非数字值(如字符串和对象),则返回true。
var x = NaN;
var a = "hello"
console.log(x != NaN); // => true
console.log(isNaN(x)); // => true
console.log(isNaN(a)); // => true
日期和时间
// js语言核心包括Date()构造函数,用来创建表示日期和时间的对象。这些日期对象的方法为日期计
// 算提供了简单的API。日期对象不像数字那样是基本数据类型。一下给出了使用日期对象的简单教程
var then = new Date(2019,0,1);
console.log(then) // =>Tue Jan 01 2019 00:00:00 GMT+0800 (中国标准时间)
var later = new Date(2019,0,1,17,10,30);
console.log(later) // =>Tue Jan 01 2019 17:10:30 GMT+0800 (中国标准时间)
var now = new Date(); //当前日期和时间
var elapsed = now - then; // =>12668725109: 计算时间间隔的毫秒数(日期减法)
later.getFullYear(); // => 2019
later.getMonth(); // => 0: 从0开始计数的月份
later.getDate(); // => 1: 从1开始计数的天数
later.getDay(); // => 2(得到星期几): 0代表星期日,5代表星期一
later.getHours(); // => 当地时间17(即下午5点)
later.getUTCHours(); // => 9: 使用UTC表示小时的时间,基于时区
3.2 文本
转义字符:
\o NUL字符(\u0000)
\b 退格符(\u0008)
\t 水平制表符(\u0009)
\n 换行符(\u000A)
\v 垂直制表符(\u000B)
\f 换页符(\u000C)
\r 回车符(\u000D)
\" 双引号(\u0022)
\' 撇号或单引号(\u0027)
\\ 反斜杠(\u005C)
\xXX 由两位十六进制数XX指定的Latin-1字符
\uXXXX 有4位十六进制数XXXX指定的Unicode字符
字符串使用:
//+(加号)运用于字符串,表示字符串连接
msg = "Hello,"+"World"; // => "Hello, World"
// 字符串提供了许多可以调用的方法如:
var s = "hello, world";
s.length // =>12: 字符串长度
s.charAt(0) // =>"h": 查找第一个字符
s.charAt(s.length-1) // =>"d": 查找最后一个字符
s.substring(1,4) // =>"ell": 截取第2~4字符(不包括4)
s.slice(1,4) // => "ell": 同上
s.slice(-3) // => "rld": 最后三个字符
s.indexOf("l") // => 2: 字符l首次出现的位置
s.lastIndexOf("l") // => 10: 字符l最后一次出现的位置
s.indexOf("l",3) // => 3: 在位置3及之后首次出现的字符串l的位置
s.split(",") // => ["hello","world"]分割成子串
s.replace("h","H") // => "Hello, world": 全文字符替换
s.toUpperCase() // => "HELLO, WORLD"
注:
(1)js中字符串是固定不变的,类似replace()和toUpperCase()的方法都返回新字符串,
原字符串本身并没有发生改变
(2)在ECMAScript5中,字符串可以当做只读数组,除了使用charAt()方法,也可以使用[]
(方括号)来访问字符串中的单个字符:
var s = "hello, world";
s[0] //=> "h"
s[s.length-1] //=> "d"
3.3 布尔值
任意js的值都可以转换成布尔值。以下这些值会被转换成false:
undefined
null
0
-0
NaN
"" // 空字符串
所有其他的值,包括所有对象(数组)都会转换成true。
布尔值包含toString()方法,使用这个方法将字符串转换为"true"或"false"。除了这个API
还有三个重要的布尔运算符:
// 当且仅当两个操作数都为真时,才返回true
&& 运算符执行了逻辑与(AND)操作。
// 两个操作数其中之一为真,就返回true,两个操作数均为假,则返回false
|| 运算符是布尔或(OR)操作。
// 如果操作数为真,返回false,若为假,则返回true
! 运算符执行了布尔非(NOT)操作。
3.4 null和undefined
null是js语言的关键字,他表示一个特殊值,常用来描述"空值"。可将null认为是一个特殊对象值含
义是"非对象",通常认为null是它自有类型的唯一一个成员,可以表示数字、字符串和对象是"无值"的
typeof null //=> object
undefined是变量的一种取值,表明变量没有初始化,如要查询对象属性或数组元素值时返回undefined
则说明这个属性或元素不存在。如果函数没有返回任何值,则返回undefined
typeof undefined //=> undefined
3.5 全局对象
// 在代码的最顶级--不在任何函数内的js代码--可以使用js关键字this来引用全局对象
var x = this;
console.log(x)
console.log(global)
console.log(window)
注: 以上三种方式均为获取全局对象方式
显示类型转换最简单的方法就是使用Boolean()、Number()、String()、或Object()函数。当不通过new运算符调用这些函数时,他们会作为类型转换函数做类型转换:
Number("3") // => 3
String(false) // => "false"或使用false.toString()
Boolean([]) // => true
Object(3) // => new Number(3)
如: new Object() 和 Object()即:带new和直接用的区别:分别为静态方法和实例方法,
静态方法直接引用,例如:
function A(){}
A.sayMeS=function(){
console.log("Hello World S!");
}
A.sayMeS();//输出Hello World S!
console.log((new A()).sayMeS()) // =>Error:sayMeS is not a function
实例方法:
function A(){}
A.prototype.sayMeE=function(){
console.log("Hello World E!");
}
var a=new A();
a.sayMeE();//输出Hello World E!
console.log(A.sayMeS()) // => Error:A.sayMeS is not a function
包装对象:存取字符串、数字或布尔值得属性时创建的临时对象。
var s = 'test'; //创建一个字符串
s.len = 4; // 给他设置一个属性
console.log(s.len) // => undefined
第二行代码创建了一个临时的字符串对象,,并给其len属性赋值为4,随即销毁这个对象。
第三行通过原始得(没有被修改过)字符串值创建一个新对象,尝试读取len属性,这个属
性自然不存在,表达式结果为undefined
对象转换为原始值
所有的对象继承了两个转换方法:
1.toString():它的作用是返回一个反映这个对象的对象
({x:1,y:2}).toString() // => '[object object]'
[1,2,3].toString() // => '1,2,3'
(function(x){f(x);}).toString() // => 'function(x){f(x);'
2.valueOf():存在任意原始值,将默认将对象表述为原始值,对象是复合值,则只是简单的返回对象本身
var d new Date(2010,0,1) // 2010年1月1日(太平洋时间)
d.valueOf() // => 1262332800000
表示1970年1月1日以来的毫秒数