Javascript 学习记录
不要使用传统语言(C#,JAVA)的面向对象理念去理解JS, 在ES5中没有类这个概念,虽然也有new操作符, 但完全可以不去用, function在js中是一等公民, 可以用function去做任何事情, 当然也包括创建对象,js中的编程风格是函数式编程, 在js中不需要通过new去创建对象, 这样看上去也比较奇怪,也不利于理解JS.当创建一个新对象时, 只需要说让这个新对象看上去像某个对象就OK了, 这个就是原型, 新对象是以某个对象为原型创建的, 所以新对象拥有原型对象(看上去像的对象)特征.
那应该怎么去创建对象呢.有一种最简单的方式,对象字面量, var o = {};没错就这么简单. 刚才说一个对象要像另外一个对象那这个对象像谁呢? 没错当创建一个对象的时候这对象一定会有一个参考对象(或者叫蓝本), 这个对象(o)就是参考Object创建的, Object是js中所有对象的始祖
JS中的对象按创建方式分为两种 : 一种是 函数对象, 一种是 通过函数对象创建的对象
"use strict" 开启ES5的严格模式
javascript是unicode字符集编写的, 所以天生支持unicoude, unicode转意符以\u开头,后面接4个16进制数(\u00e9)
javascript区分大小写
javascript中空格是被忽略的,可以在程序的标识之间使用任意数量的空格. 换行, 分号在不引起歧义的情况下也会被忽略掉
数据类型
javascript不是强类型语言,所以在给变量赋值的时候不需要指明变量的具体类型,根据其上下文的环境自动判断数据类型
数字(number), 字符串(string), 布尔(boolean),对象(object). 前面三个是原始类型, 最后一个是对象类型, null, defined, NaN, Infinity这些是js中的特殊值
js中的浮点数使用的是二进制表示法(IEEE-754), 该表示法, 可以精确的表示二进制分数1/2, 1/8, 1/1024,但对于我们日常使用的十进制分数无法准确的表示
0.2-0.1=0.1 0.3-0.2=0.09999999999999998 0.4-0.3=0.10000000000000003 0.5-0.4=0.09999999999999998
对于这样的问题我们可以通过.toFixed(n)四舍五入来解决, n=0-20包括0,20
3种原始类型也可以属性,原因是javascript也有"装箱"和"拆箱"的过程,所以这3种类型虽然可以使用对应对象的相关属性,但类型却不是对象
数字类型
javascript中不分整型和浮点,一律使用浮点类型, 范围是253~2-53,但数组索引和位运算则是基于32位整数.一些复杂的算数运算我们可以通过Math来完成.
布尔类型
布尔值主要用于关系判断,js中的所有类型在进行关系判断的时候都会进行类型转换
undefine, null, NaN, 0, -0, ""(空字符串) 这些类型会被转换为false, 除此以外其他的值都会被转换成true.
用于关系判断的运算符有: ==(等于), ===(严格相等), !=(不等于), !==(不严格相等), >(大于), <(小于), >=(大于等于), <=(小于等于), in运算符, instanceof运算符
Date是javascript的内置对象,我们通过new Date来创建日期对象
var d = new Date(); //用当前的时间创建一个日期对象 var d = new Date(2015,0,1);//表示2015-01-01, javascript是从0开始计算月份的 var s = new Date(2015,0,1,0,0,0);//开始时间 var d = new Date(2015,0,1,0,0,1);//开始时间 d-s=1000;//时间间隔用毫秒表示 d.getYear(); //当前年份-1900的值 d.getFullYear();//获取年份 d.getMonth();//获取月份, 从0开始计算, 12月得到的是11 d.getDate();//获取天数, 从1开始计算 d.getDay();//获取星期数,从0开始计算,星期天用0表示,国外的习惯是星期天是一个星期的开始 d.getHours();//获取小时数(0-23), 如果写24会自动转换成第二天的0时(webkite下面测试) d.getMinutes();//获取分钟数(0-59) d.getSeconds();//获取当前秒数(0-59)
数据类型的转换
javascript的原始类型就3种,数字,字符,布尔类型. 这三种类型之间的转换比较简单,
(数字, 布尔)-->(字符串):数字转换成字符串是把数字表示的值直接转换成字符串形式, 布尔转换成字符串是 "false" 和 "true",
(数字, 字符串)-->(布尔):空字符串("",引号之间没有空格), 0 和 -0 转换成布尔为假值(false), 其他的数字和字符串都转换成真值(true),
(字符串, 布尔)-->(数字):所有以数字表示的字符串("12", "22")可以直接转换成对应的数字, 字符串中的开始和结束的空格会被忽略调, 对于非空,非数字开头的字符串会被转换成NaN
强制类型转换
parseInt, parseFloat, Boolean, Number, String后3个是内置对象的构造函数
根据上下文环境发生的类型转换
23+"string" ==> 转换成字符串
"4"*"3" ==> 转换成数字
全局对象
当javascript解释器启动的时候会创建一个全局对象, 并给全局对象初始化一些特定的属性
Object.prototype.hasOwnProperty
该API用于判断当前对象是否包含某个自身属性, 所谓自身属性是指非继承的属性, 该API可以区分那些属性是继承的属性那些是自身的属性, 自身的属性会返回true, 继承的属性返回false
Object.prototype.isPrototypeOf
该API用于判断一个对象是否在另一个对象的原型链上
function Fee() { // . . . } function Fi() { // . . . } Fi.prototype = new Fee(); function Fo() { // . . . } Fo.prototype = new Fi(); function Fum() { // . . . } Fum.prototype = new Fo(); var fum = new Fum(); . . . if (Fi.prototype.isPrototypeOf(fum)) { // ... }
面向对象的特性
JS中也实现了一些面向对象的特性, 比如说对象, 继承, 多态, 因为面向对象的概念只是一个规范, 每种语言对规范的实现是不一样的. 在JS中就没有类的概念(至少在ES5之前是这样的). 如果没有类的概念, 那对象是按什么样的标准创建的呢? 在C#, C++这样的语言中
所有的对象都能追根溯源, 最后能找到Object 这个类. 在JS中所有对象的根是NULL, 在JS中对象是通过原型链进行溯源的, 出了NULL 所有的对象都一个__proto__属性, 这个是一个未公开的属性, 这个属性告诉了我们该对象是根据那个原型创建出来的