1.JavaScript简介
- js是诞生于1995年,由网景公司的布兰登·艾奇(brendan eich)最初设计出来是为了表单验证,只花了10天设计出来,JS从一个简单的输入验证器发展到今天成为一个强大的编程语言,完全出乎人民的意料。
- 吐槽一下:js它的优秀之处并非原创,它的原创之处并不优秀,由于是个胶水语言,很多功能并实现不了,而且疯狂打自己脸,比如es 6 7 8,但是没关系我们爱它。
- 当初网景公司蹭JAVA的热度,和SUN公司联合把LiveScript改成了JavaScript。巨硬1996年呢退出了JScript,网景公司弄不赢巨硬呀,于是把JS交给了欧洲计算机制造商协会ECMA。
- ECMA把一堆知名公司的程序员联合在一起共同探讨规范,他们经过了数个月的努力定义了一个名为ECMAScript的标准,ECMAScript是JS的标准
- javaScript是由3个部分组成在:
- ECMAScript(提供核心语言功能)
- 浏览器对象模型(BOM)提供与浏览器交互的方法和接口
- 文档对象模型(DOM)提供访问和操作网页的方法和借口
1.1文档对象模型(DOM)
DOM是针对XML经过拓展用于HTML的应用程序编程接口(API),DOM把整个页面映射成一个多层节点解构(tree)
通过DOM创建的树形图,开发人员获得了控制页面内容和解构的主动权,通过DOM的api可以轻松自如的,增删改查任何节点
在HTML中使用javaScript
script标签
<script src="script.js"></script>
没有 defer 或 async,浏览器会立即加载并执行指定的脚本,“立即”指的是在渲染该 script 标签之下的文档元素之前,也就是说不等待后续载入的文档元素,读到就加载并执行。
<script async src="script.js"></script>
有 async,加载和渲染后续文档元素的过程将和 script.js 的加载与执行并行进行(异步)。
<script defer src="myscript.js"></script>
有 defer,加载后续文档元素的过程将和 script.js 的加载并行进行(异步),但是 script.js 的执行要在所有元素解析完成之后,DOMContentLoaded 事件触发之前完成。
基本概念
数据类型
Undefined
var message
alert(message)//'undefined'
alert(age) // Uncaught ReferenceError: age is not defined at <anonymous>:4:7
复制代码
任何时候你都没有必要声明一个值为undefind
,对于未声明和未初始化的变量,typeof
都返回了undefined
,这个结果有逻辑上的合理性,虽然这两种变量从技术角度有本质的区别,单思实际上无论那种变量都不能进行真正的操作
var message
typeof message//'undefined'
typeof age //'undefined'
复制代码
Null
null
表示空对象指针
typeof null //'object'
复制代码
null
派生至undefined
,所以null == undefined
Boolean
5个falsy值
''、0、NaN、undefined、null
Number
八进制以0开头,如果字面值中的数值超出了范围,那就会被当成10进制来解析
var a =070
console.log(a)
//56
复制代码
16进制以0x卡头,后面跟(0-9,A-F),大小写相同,在进行算术计算时,所有以8进制和16进制表示的数值均会准换成10进制
浮点数
浮点数的最高精度是17位小数,在进行算术计算时远不如整数,0.1+0.2=0.300000000000000004
,所以,永远不要测定某个特定的浮点数值
数值范围
由于内存的限制,js并不能保存所有的数值,能保存的最小数是Number.MIN_VALUE
,在大多数浏览器中,这个数是5e-323
,最大数是NumbeR.MAX_VALUE
,是1.7976931348623157e+308
,如果计算超过了这个数值,那么这个数值会被转化为+Infinity,如果是负数那么是-Infinity。
isFinite(Number.MAX_VALUE)
//true
复制代码
如果某次计算返回了Infinity,那么该值将无法进行下一次计算
NaN
NaN进行任何操作都会返回NaN,NaN也不等于NaN,我们可以使用isNaN()
API来检测是否是NaN
数值转换
有3个函数可以进行数值转换Number()、parseInt()、parseFloatI()
Number()可以用于任何数据类型,剩下两个专门用于string转number,最好使用后面两个,Number()规格复杂,比如Number('')返回0,parseInt('')返回NaN,
Number('213abf')//NaN
parseInt('213abf')//213
Number('213abf')//NaN
parseInt('213abf')//213
复制代码
在es3和es5中对8进制的解析是不同的
parseInt('070')//es3 56
parseInt('070')//es5 70
复制代码
所以无论在任何时候都不要省略parseInt的第二个参数(基数)
如果第一个数字不是string,那么会自动调用toString方法先转化为string
parseInt("17", 8);//15 (1*8^1+7*8^0)
parseInt(021, 8);//15 (021.toString()//17)
复制代码
parseInt('070',8)//56
parseInt('070',10)//79
复制代码