Javascript权威指南阅读笔记--第3章类型、值和变量(1)
之前一直有个想法,好好读完JS权威指南,便于自己对于JS有个较为全面的了解。毕竟本人非计算机专业出生,虽然做着相关行业的工作,但总觉得对于基础的掌握并没有相关专业学者扎实,正好因为辞职待业等原因,还是下定决心来好好读一读这本厚厚的‘词典’。在阅读原书过程中,本人也发现了不少概念问题,可能因为汉化区别,导致实际情况与概念描述并不相符的情况,这里就全当做下笔记了。
记录从书籍第三章开始,如果有幸有人看到了本人博客并对前两章有兴趣,可以通过其它途径去了解,这里就当权威指南概念的缩减版,以及作为自己待业中激励自己坚持下去的一种方式了。
3.类型、值和变量
Javascript的数据类型分为两类,原始类型(或基本类型),与对象类型(或引用类型)。
其中,原型类型包括数字,字符串,布尔值以及两个特殊的原始值null与undefined五类,对象类型就是常见的无序名值对{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的类型标签也成为了 0,typeof 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)的更多相关文章
- JavaScript权威指南读书笔记【第一章】
第一章 JavaScript概述 前端三大技能: HTML: 描述网页内容 CSS: 描述网页样式 JavaScript: 描述网页行为 特点:动态.弱类型.适合面向对象和函数式编程的风格 语法源自J ...
- JavaScript权威指南阅读笔记3
第六章 对象 1.首先是先介绍了对象直接量的格式:对象直接量就是1.由若干个名/值对组成的映射表,2名/值对中间由冒号分割,3名值对之间由逗号分割,4整个映射表由花括号括起来.这样就组成了一个对象直接 ...
- JavaScript 权威指南-学习笔记(一)
本文所有教程及源码.软件仅为技术研究.不涉及计算机信息系统功能的删除.修改.增加.干扰,更不会影响计算机信息系统的正常运行.不得将代码用于非法用途,如侵立删! ## JavaScript 权威指南-学 ...
- JavaScript权威指南学习笔记6
这两天主要翻看了书中的第18-22章,重点看了第17章:事件化处理,其它几章节主要是翻了下书知道有相关的概念,没有真正理解其中的内容,或者没有考虑究竟如何能把里面的内容应用到实际的项目中.说的讽刺一点 ...
- Kafka 权威指南阅读笔记(第三章,第四章)
Kafka 第三章,第四章阅读笔记 Kafka 发送消息有三种方式:不关心结果的,同步方式,异步方式. Kafka 的异常主要有两类:一种是可重试异常,一种是无需重试异常. 生产者的配置: acks ...
- Javascript权威指南学习笔记
第二章:词法结构 ;function a(){alert(2)};//前面的分号保证正确地语句解析 第三章:类型.值和变量 基本概念: 1.数据类型---能够表示并操作的值的类型叫做数据类型. 2.变 ...
- css权威指南读书笔记-第10章浮动和定位
这一章看了之后真是豁然开朗,之前虽然写了圣杯布局和双飞翼布局,有些地方也是模糊的,现在打算总结之后再写一遍. 以下都是从<css权威指南>中摘抄的我认为很有用的说明. 浮动元素 一个元素浮 ...
- javascript权威指南学习笔记2
Javascript语言核心(2~12章) 第三章:类型.值.变量 1.数字: overflow(Infinity, -Infinity).underflow(+0,-0) 非数字值:它和任何值都不相 ...
- JavaScript权威指南学习笔记5
下午在杭图回去前看了书中第二部分的13-17章,看的很粗,感觉大部分东西自己已经知道或者平时开发中不会用到,很多章节只是简单的翻了一下,没有仔细思考里面说到的道理,下面对各章节简单的记录下. 第13章 ...
随机推荐
- VIM 实现tab标签页及分屏,切换命令
1,在一个窗口中,VIM 的小tab标签页命令: :tabnew [++opt选项] [+cmd] 文件 建立对指定文件新的tab :tabc 关闭当前的tab ...
- C# if else 使物体在X轴循环移动
if( transform.position.x > -15 && transform.rotation.y == 0 ) { //小鸟X轴反方向移动速度 transform.p ...
- Grid++Report报表工具C/S实战篇(五)
一.课程介绍 本次分享课程属于<C#高级编程实战技能开发宝典课程系列>中的第五部分,阿笨后续会计划将实际项目中的一些比较实用的关于C#高级编程的技巧分享出来给大家进行学习,不断的收集.整理 ...
- 在Asp.Net MVC中利用快递100接口实现订阅物流轨迹功能
前言 分享一篇关于在电商系统中同步物流轨迹到本地服务器的文章,当前方案使用了快递100做为数据来源接口,这个接口是收费的,不过提供的功能还是非常强大的,有专门的售后维护团队.也有免费的方案,类似于快递 ...
- Fiddler工具使用介绍二
在上一篇中介绍了Fiddler的基本使用方法.通过上一篇的操作我们可以直接抓取浏览器的数据包.但在APP测试中,我们需要抓取手机APP上的数据包,应该怎么操作呢? Andriod配置方法: 1)确保手 ...
- qt在windows下编译遇到的一些问题
软件是在linux上写的,然而搬到windows上来遇到了好多问题.... 想跪.... 首先就是压根编译不了的问题....这个问题困扰我好久了....一直报错undefined reference ...
- 在Node中使用ES6语法
Node本身已经支持部分ES6语法,但是import export,以及async await(Node 8 已经支持)等一些语法,我们还是无法使用.为了能使用这些新特性,我们就需要使用babel把E ...
- LOJ#3093. 「BJOI2019」光线(递推+概率期望)
题面 传送门 题解 把\(a_i\)和\(b_i\)都变成小数的形式,记\(f_i\)表示\(1\)单位的光打到第\(i\)个玻璃上,能从第\(n\)个玻璃下面出来的光有多少,记\(g_i\)表示能从 ...
- 17_python_成员
一.类成员 1.字段 class Province: country = '中国' # 实例 (静态) 字段:类变量. 不属于对象, 对象可以访问 def __init__(self, name): ...
- CGI + FastCGI(PHP-FPM)联系与区别 【图解 + 注释】
〇.背景 参考了几篇文章,总结成 图解 + 注释 方便以后查阅. 参考资料: 1.https://www.zhihu.com/question/19582041 2.https://segmentfa ...