第三章(2):基本概念(学习笔记)

数据类型

ECMAScript目前有7中数据类型,Undefined, Null, Number, String, Boolean, Object, Symbol

  1. typeof 操作符
    typeof操作符可以鉴定变量的数据类型。如下 :
var testUndefined
  var testNull = null
  var testNumber = 123
  var testString = 'hello,world'
  var testBoolean = true
  var testObject = {}
  var testArray = []
  var testSymbol = Symbol(1)
  console.log(typeof testUndefined) // 结果: undefined
  console.log(typeof testNull)  // 结果:object
  console.log(typeof testNumber)  // 结果:number
  console.log(typeof testString)  // 结果:string
  console.log(typeof testBoolean) // 结果:boolean
  console.log(typeof testObject)  // 结果:object
  console.log(typeof testArray)  // 结果:object
  console.log(typeof testSymbol)  // 结果:symbol

可以看到Null, Array通过typeof操作符来判断返回的都是object,通过Object.prototype.toString.call(变量)来进行精确的判断。如下:

  console.log(Object.prototype.toString.call(testNull)) // 结果: [object Null]
  console.log(Object.prototype.toString.call(testArray))  // 结果:[object Array]
  1. Undefined 类型
    声明未初始化的变量的默认值为undefined
  2. Null 类型
    从逻辑角度来看, null 值表示一个空对象指针,可以用来初始化一个对象。
  3. Boolean 类型
    布尔类型,之后两个:true或者false.一般多用于条件控制语句。其他类型都可以转化为Boolean。规则如下:


    转换规则
  4. Number 类型
    (1) ECMAScript中的数值类型采用IEEE754格式来表示。整数的类型,有十进制,八进制,十六进制。默认为十进制,在数值计算和赋值的时候都会转化为十进制的结果。如下:
  var num10 = 100
  var num8 = 070
  var num16 = 0xA
  console.log(num10)  // 100
  console.log(num8) // 56
  console.log(num16) // 10

需要注意的是,严格模式下,八进制会报错。Uncaught SyntaxError: Octal literals are not allowed in strict mode.
(2) 采用IEEE754格式的浮点数计算有个通病,那就是小数位有计算精度。产生这个结果的原因是因为小数在计算机计算过程中以下几个步骤:
1 转化为二进制
2 采用科学技术法
3 表示成 IEEE 754 形式
在1和3的过程中都会发生精度丢失的问题。如十进制的0.7可以准确的表示一个小数,但是转换为二进制却是一个循环的小数。所以才会导致精度丢失的问题。
解决办法很多,介绍其中一种:可以通过toPrecision来指定小数位。例子如下:

  // 浮点数计算精度问题
  let num = 0.2 + 0.4
  console.log('num: ', num)  // num:  0.6000000000000001
  let toPrecision = num.toPrecision(1)  
  console.log('toPrecision: ', toPrecision)   // toPrecision:  0.6

(3) 数值范围
ECMAScript不可能保存所有范围内的数值。他的最大值和最小值保存在Number中的两个属性中。如下:

console.log(Number.MIN_VALUE) // 5e-324
console.log(Number.MAX_VALUE) // 1.7976931348623157e+308

(4) NaN
代表非数值。可以通过isNaN来判断一个数值是否是非数值。如下:

  console.log(isNaN(num10)) // false
  console.log(isNaN('hello')) // true

(5) 数值转换
数值转换有3个方法:Number(), parseInt(), parseFloat()
Number()
直接看例子:

  console.log(Number(true)) // 1
  console.log(Number(false))  // 0
  console.log(Number('123'))  // 123
  console.log(Number('123hello123'))  // NaN
  console.log(Number({a: 1})) // NaN
  console.log(Number(undefined))  // NaN
  console.log(Number(null)) //0

parseInt()
转为整数,parseInt的第二个参数可以指定转换时的基数(进制),如果不指定的话,第一个参数以0开头,有可能会指定基数为8。例子如下:

  console.log(parseInt(070))  // 56 基数为8
  console.log(parseInt('010', 10))  // 10
  console.log(parseInt('123hello', 10)) // 123
  console.log(parseInt('0x')) // NaN
  console.log(parseInt('0xA'))  // 10  基数为16

parseFloat()
转为浮点数,只会解析十进制。16进制会解析为0,因为以0开头。如果有多个小数点的话,只会取第一个小数位的有效位数。如下:

  console.log(parseFloat('123.456.78')) // 123.456
  console.log(parseFloat('0xA')) // 0
  console.log(parseFloat('22.5')) // 22.5
  console.log(parseFloat('1.23e2')) // 123
  1. String 类型
    由零或多个 16 位 Unicode 字符组成的字符序列,即字符串。由单引号或者双引号包起来。
  2. Object 类型
    Object是一组数据和功能的集合。由于在 ECMAScript 中 Object 是所有对象的基础,因此所有对象都具有这些基本的属性和方法。创建方式可以通过字面量或者构造函数,如下:
var obj1 = {}  //字面量
var obj2 = new Object()  //构造函数

Object的实例属性和方法,如下:
(1) constructor
构造函数
(2) hasOwnProperty(propertyName)
用于检查给定的属性在当前对象实例中(而不是在实例的原型中)是否存在。有点绕口。直接看例子:

  var obj = {
    name: 'hello, world',
    say: function () {
      console.log('saying...')
      }
  }

  obj.prototype = {
    getName: function () {
      console.log(this.name)
      }
  }

  // 用于检查给定的属性在当前对象实例中(而不是在实例的原型中)是否存在。
  console.log(obj.hasOwnProperty('toString')) // false
  console.log(obj.hasOwnProperty('getName')) // false
  console.log(obj.hasOwnProperty('say'))  // true

(3) isPrototypeOf()
测试一个对象是挂载与另一个对象的原型链上。如下:

  // 方法用于测试一个对象是否存在于另一个对象的原型链上。   Fee > Fi > Fo > Fum
  function Fee() {
      // . . .
  }

  function Fi() {
      // . . .
  }
  Fi.prototype = new Fee();

  function Fo() {
      // . . .
  }
  Fo.prototype = new Fi();

  function Fum() {
      // . . .
  }
  Fum.prototype = new Fo();

  var fum = new Fum();
  console.log(Fi.prototype.isPrototypeOf(fum))  // true

(4) toString()
返回对象的字符串表示
(5) valueOf()
作用和toString()类似

引用

javascript高级程序设计第三版
浮点数问题
代码之谜 浮点数
isPrototypeOf()

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,710评论 4 376
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,839评论 2 308
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,295评论 0 255
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,776评论 0 223
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,198评论 3 297
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,074评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,200评论 2 322
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,986评论 0 214
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,733评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,877评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,348评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,675评论 3 265
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,393评论 3 246
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,209评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,996评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,212评论 2 287
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 36,003评论 2 280

推荐阅读更多精彩内容

  • 第三章 基本概念 3.1 语法 ECMAScript标识符一般采用驼峰大小写格式,也就是第一个字母小写,剩下的每个...
    小雄子阅读 509评论 0 1
  • 深入理解JavaScript系列文章,包括了原创,翻译,转载,整理等各类型文章,如果对你有用,请推荐支持一把,给大...
    DaveWeiYong阅读 544评论 0 1
  • 变量 声明变量 命名变量区分大小写的语言第一个字符是字母或下划线_,数字不能作为第一个字符字符必须是字母,数字或者...
    flyingtoparis阅读 745评论 0 0
  • 1.JavaScript 定义了几种数据类型? 哪些是原始类型?哪些是复杂类型?原始类型和复杂类型的区别是什么? ...
    saintkl阅读 289评论 0 0
  • 你跟我说,清明节要回家 有过世的老爹,在盼你。 我说,我爸回去就行了 你不满意地挂了电话。 我知道这是我的叛逆。 ...
    想和小鱼一起游阅读 257评论 0 0