JavaScript高级程序设计学习笔记(一)
最近为了补js的基础,开坑javascript高程,这书基础部分写得很详细很好读,搭配着MDN进行学习理解。
闲下来的时间记录一下边读边做的笔记,大多是以前编程的时候没注意过的基础知识点。
文章目录
- 第一章
- 第二章
- 第三章
- 语法
- 变量
- 数据类型
- 0.1+0.2!=0.3
- 操作符
- 语句
- 函数
- 总结
第一章
JavaScript的完整实现包括以下三个部分:
1、核心(ECMAScript),提供核心语言功能。
2、文档对象模型(DOM),提供访问和操作网页内容的方法和接口。
3、浏览器对象模型(BOM),提供与浏览器交互的方法和接口。
第二章
script标签
延迟脚本:定义defer属性,表明脚本在执行时不会影响页面的构造,也就是脚本会被延迟到整个页面都解析完毕再运行。
<head>
<script type="text/javascript" defer="defer" src="e1.js"></script>
<script type="text/javascript" defer src="e2.js"></script>
</head>
HTML5中规范以上两个脚本按先后顺序执行,但现实中不一定会按照顺序执行(因此最好只包含一个延迟脚本)。
异步脚本:定义async属性,告诉浏览器立即下载文件,与defer不同,标记为async的脚本并不保证按照先后顺序执行。
<head>
<script type="text/javascript" async src="e1.js"></script>
<script type="text/javascript" async src="e2.js"></script>
</head>
由于第二个脚本文件可能会在第一个脚本文件之前执行,所以应当确保两者互不依赖。指定async属性是为了不让页面等待脚本的下载,从而异步地去加载页面其他内容,建议异步脚本不要在加载期间修改DOM。
(异步脚本一定会在页面的load事件前执行)
第三章
语法
严格模式
在脚本顶部添加"use strict",其实是一个编译指示,用于告诉JavaScript引擎切换到严格模式。
语句
1、分号结尾!(以前python的后遗症,经常忘加分号,这会导致代码压缩错误)
2、对于控制语句,推荐用{ }代码块,让编码易读,且意图清晰!
变量
var操作符
用var定义的变量会成为定义该变量作用域中的局部变量,比如说在函数中定义了一个变量,那么该变量将在退出函数时被销毁。(之前以为是全局使用的,跟let搞混了)
在声明和定义时var可以省略,用于定义全局变量,但不是推荐做法,避免造成不必要的混乱。
数据类型
typeof操作符
注意 typeof 它不是个函数,是个操作符!
typeof 1 // 'number'
typeof '1' // 'string'
typeof true // 'boolean'
typeof null // 'object'
typeof [] // 'object'
typeof {} // 'object'
typeof console.log // 'function'
typeof undefined // 'undefined'
typeof b // b 没有声明,但是还会显示 undefined
typeof Symbol() // 'symbol'
//Symbol是ES6的新类型,类似于一种标识唯一性的ID,第三版的书上没有
PS:书上说null是object类型,但没说为什么,这里引用一篇博客里说到的:
这是因为在 JS 的最初版本中,使用的是 32 位系统,为了性能考虑,使用低位存储了变量的类型信息,000 开头代表是对象,然而 null 表示为全零,所以将它错误的判断为 object 。虽然现在的内部类型判断代码已经改变了,但是对于这个 Bug 却是一直流传下来。
undefined类型
未被初始化的变量,会被自动赋予undefined值;而对未声明的变量,typeof会返回undefined而不会报错。
这提醒我们最好初始化变量的时候能够赋予明确的值,这样易于区分被检测的变量是未被声明,还是未被初始化(这样规范的话,undefined就代表变量未被声明)。
boolean类型
Boolean()函数,需要注意0和NaN(Number类型)会被转换为false。
number类型
注意十进制、八进制和十六进制的表示。
var intNum=55; // 十进制的55
var octalNum=072; // 八进制的58
var hexNum=0x2f; // 十六进制的47
0.1+0.2!=0.3
面试的经典问题:0.1+0.2!=0.3
原因:
因为 JS 采用 IEEE 754 双精度版本(64位),并且只要采用 IEEE 754 的语言都有该问题。
我们都知道计算机表示十进制是采用二进制表示的,所以 0.1 在二进制表示为
// (0011) 表示循环
0.1 = 2^-4 * 1.10011(0011)
小数算二进制和整数不同。乘法计算时,只计算小数位,得到第一个进位就是最高位。所以我们得出 0.1 = 2^-4 * 1.10011(0011),那么 0.2 的演算只需要去掉第一步乘法,所以得出 0.2 = 2^-3 * 1.10011(0011)。
回来继续说 IEEE 754 双精度。六十四位中符号位占一位,整数位占十一位,其余五十二位都为小数位。因为 0.1 和 0.2 都是无限循环的二进制了,所以在小数位末尾处需要判断是否进位(就和十进制的四舍五入一样)。
所以 0.1的二进制表示(0.1 = 2^-4 * 1.10011(0011)) 进位后就变成了 2^-4 * 1.10011(0011 * 12次)010,同理可得0.2的二进制表示。
把这两个二进制加起来得到 2^-2 * 1.0011(0011 * 11次)0100 , 这个值再换算成十进制就是 0.30000000000000004。
// 计算过程
0.00011001100110011001100110011001100110011001100110011010
0.0011001100110011001100110011001100110011001100110011010// 相加得
0.01001100110011001100110011001100110011001100110011001110
// 转换为IEEE 754的64位表示(小数位保留52位)
0.01(整数位)0011001100110011001100110011001100110011001100110011(52位后面舍去,因为四舍五入要进位)10->
0.01(整数位)0011001100110011001100110011001100110011001100110100->
0.30000000000000004
//PS:数得我眼睛快花了
number类型的数值范围
小于Number.MIN_VALUE->-Infinity<-Number.NEGATIVE_INFINITY
大于Number.MAX_VALUE->Infinity<-Number.POSITIVE_INFINITY
NaN(Not a Number)的判断
isNaN(),判断是否“非数值”,如果不能转换为数值,返回true。
数值转换三个函数
把非数值转换为数值可以用:
Number()、parseInt()、parseFloat()
注意字符串会去掉前导零。
转换为字符串
toString()方法,在调用数值的toString()方法时,可以传入输出数值的基数,默认转换为十进制格式。
object类型
object实例的属性和方法:
constructor(),构造函数
hasOwnProperty(propertyName),检查属性在当前对象实例中是否存在
isPropertyOf(object),检查传入对象是否当前对象的原型
propertyIsEnumerable(propertyName),检查属性是不是可用for-in语句枚举
toLocaleString(),返回对象的字符串表示,该字符串与执行环境的地区对应(没太懂,MDN上举了时区和人民币格式的例子)
toString(),返回对象的字符串表示
valueOf(),返回对象的字符串、数值或布尔值表示
注意:propertyName要用字符串形式传入(“propertyName”)。
操作符
位操作符
注意一下按位非:
var num1 = 25;
var num2 = ~num1; // -26
返回数值的反码,也就是操作数的负值-1。
右移分为有符号右移(>>)和无符号右移(>>>),区别是有符号右移用符号位来填充空位,无符号右移用0来填充空位。
布尔操作符
两个逻辑非(!!)效果和Boolean()方法一样
逻辑与和逻辑或的短路性质
乘性操作符
Infinity*0 // NaN
Infinity*1 // Infinity
Infinity*-1 // -Infinity
除性操作符
Infinity/Infinity // NaN
非零有限数除以0 // Infinity或者-Infinity
关系操作符
有意思的现象:
var result1 = NaN <3; // false
var result2 = NaN >=3; // false
相等操作符
相等(==)会进行类型转换(强制转型)再进行比较
全等(===)在两个操作数未经转换就相等的情况下返回true
语句
了解label语句与break和continue语句的联合使用。
严格模式下不允许使用with语句。
switch语句在比较值时,使用的是全等操作符,因此不会发生类型转换。
函数
arguments的理解:数组形式(并不是Array的实例)。
通过接受参数的个数不同,可以让函数分别实现不同的功能:
function doSomething(){if(arguments.length==0){do1();}else if(arguments.length==1){do2();}else if(arguments.length==2){do3();}else{do4();}
}
ECMAScript中的所有参数传递的都是值,所以不可能通过引用传参。
函数名字相同时,该名字属于后定义的函数(也就是ECMAScript函数不能实现重载,因为函数没有签名,参数由包含零或多个值的数组来表示)。
尽管如此,通过检查传入函数中参数的类型和数量,来作出不同反应,还是可以模仿函数方法的重载的。
总结
第三章对类型转换讲解得非常详细,我也结合了MDN文档进行补充和了解,以前的粗犷学习路线导致自己有很多知识漏洞,还要继续查漏补缺!
接下来针对第四(变量、作用域和内存问题)和第五章(引用类型)进行学习。
PS:把高程当小说读还是不错的,我其实先看了比较感兴趣的第十五章(Canvas绘图),有OpenGL的基础,看起来饶有兴趣!
如果对你产生了帮助,请点个赞给我吧!感谢观看!
JavaScript高级程序设计学习笔记(一)相关推荐
- JavaScript高级程序设计学习笔记(三)
分享一下第五章(引用类型)的笔记,内容比较多,我拆成了两部分,今天这部分是关于Object.Array.Date和RegExp类型的. 以下的笔记是书上一些我以前学习的时候,没有太重视的js基础知识, ...
- javascript高级程序设计学习笔记
javascript高级程序设计,当枕头书已经好久了~zz 现在觉得自己在js的开发上遇到了一些瓶颈,归根究底还是基础太薄弱,所以重新刷一遍js高程希望有更新的认识. 一.javascript简介 ...
- javascript高级程序设计 学习笔记 第五章 上
第五章 引用类型的值(对象)是引用类型的一个实例.在 ECMAScript 中,引用类型是一种数据结构, 用于将数据和功能组织在一起.它也常被称为类,但这种称呼并不妥当.尽管 ECMAScri ...
- JavaScript高级程序设计--学习笔记(第六章)
文章目录 第六章 面向对象的程序设计 1. 理解对象 1.1 属性类型 1.2 定义多个属性 1.3 读取属性的特性 2. 创建对象 2.1 工厂模式 2.2 构造函数模式 2.3 原型模式 2.4 ...
- JavaScript高级程序设计学习笔记二(在HTML中使用JavaScript)
在 HTML 中使用 JavaScript 在html中使用JavaScript脚本有两种方式一种是嵌入在HTML中的脚本,另一种是引入外部的脚本.两种方式都离不开<script>元素. ...
- JavaScript高级程序设计学习笔记第二十章--JSON
1.JSON:JavaScript Object Notation, JavaScript 对象表示法. 2.最重要的是要理解它是一种数据格式,不是一种编程语言.虽然具有相同的语法形式,但 JSON ...
- JavaScript高级程序设计---学习笔记(四)
1.全局变量不能通过delete操作符删除,而直接在window对象上定义的属性可以. var age = 29;window.color = "red";delete age;/ ...
- JavaScript高级程序设计学习笔记--事件
HTML事件处理程序 <input type="button" value="Click Me" onclick"showMessage()&q ...
- JavaScript高级程序设计学习笔记--DOM
DOM(文档对象模型)是针对HTML和XML文档的一个API(应用程序接口). Document类型 文档的子节点 虽然DOM标准规定Document节点的子节点可以是DocumentType,Ele ...
- JavaScript高级程序设计学习笔记----初识JavaScript
一.JavaScript概述 1.JavaScript 介绍: 简称JS,是一种浏览器解释型语言,嵌套在HTML文件中交给浏览器解释执行.主要用来实现网页的动态效果,用户交互及前后端的数据传输等. 2 ...
最新文章
- tomcat变量环境脚本setclasspath.sh分析
- sql入侵 mysql日志_服务器入侵日志分析(一)——mysql日志位置确定
- Struts Gossip: 模組化程式
- lisp 河道水面线计算_天然河道水面线计算的几种方法解剖.pdf
- spring框架里面applicationContext.xml 和spring-servlet.xml 的区别
- 较真的来了!这篇【硬核论文】为何恺明新作MAE提供了一种理论解释和数学证明...
- docker宿主机访问容器_干货来啦!带你初探Docker逃逸
- CSS中调用JS函数和变量
- 通过ODBC连接PostgreSQL和Greenplum
- zemax设置 像方远心_ZEMAX:如何翻转整个光学系统
- pdf怎么移除权限口令,忘记pdf密码如何找回?
- c语言中字符型char数据在内存中占,互联网常识:在c语言中char型数据在内存中的储存形式为什么...
- vue中使用v-for,出现警告 component lists rendered with v-for should have explicit keys
- 简单的PHP测试页代码
- i7 9750H性能怎么样?相当于台式机什么水平?
- 18项政策奖励助力武汉加快区域金融中心建设,申报奖励以及申报流程汇总
- 互联网广告新规实施 微信公众号发“软文”须标明
- 金融产品的不可能三角:收益性、风险性、流动性
- Python预测基金净值:keras神经网络
- NVIDIA面经整理