之前一直有个想法,好好读完JS权威指南,便于自己对于JS有个较为全面的了解。毕竟本人非计算机专业出生,虽然做着相关行业的工作,但总觉得对于基础的掌握并没有相关专业学者扎实,正好因为辞职待业等原因,还是下定决心来好好读一读这本厚厚的‘词典’。在阅读原书过程中,本人也发现了不少概念问题,可能因为汉化区别,导致实际情况与概念描述并不相符的情况,这里就全当做下笔记了。

记录从书籍第三章开始,如果有幸有人看到了本人博客并对前两章有兴趣,可以通过其它途径去了解,这里就当权威指南概念的缩减版,以及作为自己待业中激励自己坚持下去的一种方式了。

3.类型、值和变量

Javascript的数据类型分为两类,原始类型(或基本类型),与对象类型(或引用类型)。

其中,原型类型包括数字,字符串,布尔值以及两个特殊的原始值nullundefined五类,对象类型就是常见的无序名值对{a:1,b:2},带编号的有序集合--数组[1,2,3,4],以及函数function ab(){xx}了。

---一个面试疑虑---

在面试中,曾遇到面试官提问,基本类型是哪几类,我在答完以上五类后,面试官表示我的答案是错的,基本类型还包括了object,因为null的类型是object,null被划入了基本类型,object也该划入,如下

问题来了的,难道书上写错了?直到我看到了NMD上的解释,明白原因了,这里直接引入:

typeof null === 'object'; // 从一开始出现JavaScript就是这样的

在 JavaScript 最初的实现中,JavaScript 中的值是由一个表示类型的标签和实际数据值表示的。对象的类型标签是 0。由于 null 代表的是空指针(大多数平台下值为 0x00),因此,null的类型标签也成为了 0typeof null就错误的返回了"object"

ECMAScript提出了一个修复(通过opt-in),但被拒绝。这将导致typeof null === 'object'。点击查看原文地址

由此可以知道,null类型为object只是因为早期js规范所导致的错误显示,null并没有对象的方法,而object有,所以object不该划入原始类型。

对象是属性的集合,每个属性都由名/值构成,值可以是原始值,比如数字{a:1},字符串{a:'nice'}之类,也可以是对象[{a:1},{b:2}]。

函数是具有与它相关联的可执行代码的对象,是类方法的封装体,调用函数可运行执行代码,并返回运算结果。

如果函数使用new运算符来初始化一个新建对象,这里称之为构造函数,每个构造函数定义了由构造函数初始化的对象组成的合集。对于new运算符的使用,我们除了可以new一个数组,new一个函数之外,我们还可以new一个日期Date,new一个正则表达式RegExp以及错误类Error.

垃圾回收站机制:js解释器都有自己的内存管理机制,可以自动对内存进行及时释放,当一个对象不被任何地方指引需要,解释器就会自动释放掉它,从而回收它所占用的内存资源。我们可以这样理解,在快餐店吃饭时,负责清理桌子的阿姨总会即使清理掉客人刚离开的桌子,方便后面的客人继续使用(内存释放)。

Javascript是一种面向对象语言,简单点说,我们不需要定义全局函数去操作不同的值,而是数据本身去使用方法,例如数组a排序,我们不需要将a传入到函数sort(),像这样sort(a);而是直接使用a调用方法,像这样a.sort(),在这里,a.sort()就是sort(a)的面向对象版本。

从技术上讲,只有JS对象才能拥有方法,但是数字,字符串以及布尔值也能有自己的方法,比如字符串转换,数组切割等等,在JS中只有null与undefined是没有方法可以使用的值。

我们在前面说,JS数据类型可以分为原始类型--字符串,数字,布尔,null,undefined和对象类型--函数,数组等,其实也可以分为拥有方法类型和不可拥有方法类型,上面说了,null和undefined是不可拥有方法,其余都可以;当然,我们还可以将数据分为可变类型和不可变类型,原型数据类型都不可变,对象类型可变,比如我们可以修改一个数组的长度,为它新增子元素等等。这里我们会纳闷,字符串不是也可以读取长度,获取以及替换字节吗,其实对于字符串的方法而言,所有字符串的操作都是返回的新变量,并非有修改原字符串,如下:

var str = 'string',
str1 = str.replace('s','S');
console.log('修改前为'+str,'修改后为'+str1)

可以看到,原字符串并未被修改,类似的数字也一样,虽然有对应的方法,但这些方法并不是影响本身。

JS变量是无类型的,直白点,变量可以被赋予任何类型的值,在赋予一个类型值后也可以任意修改为其它类型的值,比如我申明一个变量var a= 1,此时变量a的值类型为数字,我们紧接着使用a='str',那么变量a的值类型由数字被替换成了字符串类型了。在JS中使用var来申明一个变量,在ES6中我们又知道了let以及常量申明const,这些后续再做描述。

JS采用词法作用域,变量分为全局变量局部变量。不在任何函数体内申明的变量称之为全局变量,它在JS程序中的任意处都是可见可被调用的,例如:

console.log(num)
var num =;

输出为undefined,并不会报错,这里就牵扯到了变量提升。正如我们前面说,var num并未在函数体内申明,没有东西限制住它,虽然申明在了console后面,但是num是随处可见的,其实它的身影在整个程序中都是可被调用的,只是说num的赋值是在console后,但是num申明却可以被修改到任何位置,随处可见,随处可用。上面代码等同于

var num;
console.log(num)
num =;

而局部变量就显得比全局变量要矜持的多,在函数体内神明的变量,它始终只能在函数体内可见,函数外部是没有权限访问这个变量的。如下:

function num(){
console.log(nummber)
var nummber =;
}
num();//undefined
console.log(nummber)//报错

可以这样理解,函数num是一个小世界,变量number相对于函数num而言是可以任意调用的,但在函数体外,我们是无权直接访问使用这个变量的。

Javascript权威指南阅读笔记--第3章类型、值和变量(1)的更多相关文章

  1. JavaScript权威指南读书笔记【第一章】

    第一章 JavaScript概述 前端三大技能: HTML: 描述网页内容 CSS: 描述网页样式 JavaScript: 描述网页行为 特点:动态.弱类型.适合面向对象和函数式编程的风格 语法源自J ...

  2. JavaScript权威指南阅读笔记3

    第六章 对象 1.首先是先介绍了对象直接量的格式:对象直接量就是1.由若干个名/值对组成的映射表,2名/值对中间由冒号分割,3名值对之间由逗号分割,4整个映射表由花括号括起来.这样就组成了一个对象直接 ...

  3. JavaScript 权威指南-学习笔记(一)

    本文所有教程及源码.软件仅为技术研究.不涉及计算机信息系统功能的删除.修改.增加.干扰,更不会影响计算机信息系统的正常运行.不得将代码用于非法用途,如侵立删! ## JavaScript 权威指南-学 ...

  4. JavaScript权威指南学习笔记6

    这两天主要翻看了书中的第18-22章,重点看了第17章:事件化处理,其它几章节主要是翻了下书知道有相关的概念,没有真正理解其中的内容,或者没有考虑究竟如何能把里面的内容应用到实际的项目中.说的讽刺一点 ...

  5. Kafka 权威指南阅读笔记(第三章,第四章)

    Kafka 第三章,第四章阅读笔记 Kafka 发送消息有三种方式:不关心结果的,同步方式,异步方式. Kafka 的异常主要有两类:一种是可重试异常,一种是无需重试异常. 生产者的配置: acks ...

  6. Javascript权威指南学习笔记

    第二章:词法结构 ;function a(){alert(2)};//前面的分号保证正确地语句解析 第三章:类型.值和变量 基本概念: 1.数据类型---能够表示并操作的值的类型叫做数据类型. 2.变 ...

  7. css权威指南读书笔记-第10章浮动和定位

    这一章看了之后真是豁然开朗,之前虽然写了圣杯布局和双飞翼布局,有些地方也是模糊的,现在打算总结之后再写一遍. 以下都是从<css权威指南>中摘抄的我认为很有用的说明. 浮动元素 一个元素浮 ...

  8. javascript权威指南学习笔记2

    Javascript语言核心(2~12章) 第三章:类型.值.变量 1.数字: overflow(Infinity, -Infinity).underflow(+0,-0) 非数字值:它和任何值都不相 ...

  9. JavaScript权威指南学习笔记5

    下午在杭图回去前看了书中第二部分的13-17章,看的很粗,感觉大部分东西自己已经知道或者平时开发中不会用到,很多章节只是简单的翻了一下,没有仔细思考里面说到的道理,下面对各章节简单的记录下. 第13章 ...

随机推荐

  1. 距离LCA离线算法Tarjan + dfs + 并查集

    距离B - Distance in the Tree 还是普通的LCA但是要求的是两个节点之间的距离,学到了一些 一开始我想用带权并查集进行优化,但是LCA合并的过程晚于离线计算的过程,所以路径长度会 ...

  2. java 图片压缩 缩放

    废话不多说,直接上代码,静态方法可直接调用,中间用流来处理的 /** * 图片缩放(未考虑多种图片格式和等比例缩放) * @param filePath 图片路径 * @param height 高度 ...

  3. 用户访问网页流程、DNS 解析流程

    一.用户访问流程 二.DNS解析流程 DNS( Domain Name System)是“域名系统”的英文缩写,是一种组织成域层次结构的计算机和网络服务命名系统,它用于 TCP/IP 网络,它所提供的 ...

  4. ORA-01653: 表 xxxx 无法通过 8192 (在表空间 USERS 中) 扩展

    Oracle中增加表空间大小的四种方法 1:给表空间增加数据文件 ALTER TABLESPACE app_data ADD DATAFILE ‘D:\ORACLE\PRODUCT\10.2.0\OR ...

  5. 1.Django入门

    MVC 大部分开发语言中都有MVC框架 MVC框架的核心思想是:解耦 降低各功能模块之间的耦合性,方便变更,更容易重构代码,最大程度上实现代码的重用 m表示model,主要用于对数据库层的封装 v表示 ...

  6. cxGrid的FilterRow默认自动匹配左边%而不是右边%

    /==============================================================================// 修改cxGrid的FilterRow ...

  7. 使用nohup后台执行ftp传输命令

    因为有的时候会需要长时间传输文件,所以想用nohup 结合shell脚本一起使用,就不用一直在电脑面前了 . nohup 用法: nohup command & 然后就会出现 对应的 pid ...

  8. 使用C#写MVC框架(一:核心原理)

    目录: 一.MVC原理解析 二.HttpHandler 1.HttpHandler,IHttpHandler,MvcHandler的说明 2.IHttpHandler解析 3.MvcHandler解析 ...

  9. [leetcode.com]算法题目 - Remove Duplicates from Sorted List

    Given a sorted linked list, delete all duplicates such that each element appear only once. For examp ...

  10. [模板]最小割树(Gomory-Hu Tree)(luogu4897)

    给定一个\(n\)个点\(m\)条边的无向连通图,多次询问两点之间的最小割 两点间的最小割是这样定义的:原图的每条边有一个割断它的代价,你需要用最小的代价使得这两个点不连通 Input 第一行两个数\ ...