第三章 基本概念 中(数据类型)

  ·   JS高设(第三版)   ·   JavaScript     浏览量:

本章内容太长,一分为三(本来一分为二,觉得不吉利,分成了三)本文包括数据类型

3.4 数据类型

话说当初天地混沌,盘古开天辟地后,天下分为六个大洲,分别为普通五大洲(基本数据类型),他们心地善良为人忠厚,Undefined、Null、Bollean、Number和String,和一个复杂多变,捉摸不透的大洲(复杂数据类型)Object(直译为对象,能不复杂吗

简称UNOSB,俗称:有你哦傻(此处省略一个字)

typeof操作符

typeof何许人也,他就是火眼金睛,能将六大洲现原形

此法宝如何使用呢?

typeof varName;

是不是很简单呢,不需要括号,因为他是操作符,和加减乘除一样
看例子
console.log()就是在浏览器按f12后的控制台(console)中打印的东西,推荐谷歌
timtu-pian-20180816165700
看吧现原形了,有点不对啊,null的原型怎么是object呢?
书上说,他是一个空对象指针,你不知道放什么,但打算用来存对象的时候就可以令他=null

Undefined类型

  • 他只有一个值,就是undefined

    如何理解呢,首先ndefined他是一个类型,这个类型只有一个值就是undefined,做个对比,稍后会提到的Number类型,他可以有很多值,1,2,3,4...是不是很清楚了呢。

  • 他是怎么出现的呢,如上图,也如下代码

var test;//定义变量但不赋值,也就是未初始化,可理解为薛定谔的undefined,忽闻海上有变量,值在虚无缥缈间

  如何理解呢,且看翻译,只需记住第一个意思(不明确的)即可,不然你可能会疯掉,它只是一种状态,只可意会不可言传
timjie-tu-20180816171059
* 所以这样的结果也在情理之中对吧
timjie-tu-20180816171500

  • 而且,包含undefined值的变量和尚未定义的变量是不一样的,上图

timjie-tu-20180816174653
惊不惊悚,神不神奇!
用typeof判断类型,两个都是undefined,也就是不明确
而直接打印一个是undefined,一个是直接报错not defined
其实还是可以理解,一个是判断类型,一个是直接拿来用,判断类型可以判断出他有没有定义,而直接用就呵呵,你咋不上天呢。
所以定义变量的时候请初始化值,为什么呢,请看下图typeof,你分得清test2、test3,哪一个定义了吗,但是1和3是不是就显而易见了呢。
timjie-tu-20180816180901
搞得这么复杂
timg

Null类型

  • 这是第二个只有一个值的数据类型,就是null,和undefined类似。
  • null表示的是一个空对象指针,typeof返回的是object

1

  • 何时使用:当定义的变量在将来可能会用于保存对象,推荐var test = null;
  • null派生自undefined,因此规定他两相等测试为true

2

  • 虽然他们有此般关系,但他们用途却不同,没有必要将变量值赋为undefined,而用于保存对象的变量推荐赋值为null,这样既能体现null作为空对象指针的惯例,又能进一步区分undefined与null
var test1 = undefuned; // 请不要这么做
var test2 = null;      // 用于存放对象,鼓励这么做

Boolean

  • 他只有两个字面值:truefalse
  • true,false区分大小写 true≠True,false≠False
  • 所有类型都有与true,false等价的值,Boolean()可用于转换,规则如下
数据类型 转为true的情况 转为false的情况
Boolean true false
String 非空字符串 ""(空字符串)
Number 非零(无穷大) 0、NaN(不是数字)
Object 任何对象 null
Undefined n/a(不适用) undefined

总结一句话,存在的东西就是真的,或者非零非空即为真

  • if等流控制语句,将会把条件自动转换为Boolean,如图

3

if语句将三个字符串变量转为Boolean
注意:第一个转为true,没毛病,
   第二个放的是空格,不是空字符串,第三个才是,注意理解区分

Number类型

  • 只要是数字,不管整数小数都属于Number
  • 默认十进制
  • 八进制第一位为0,如果超过范围去掉前导0,变为十进制如下图
  • 十六进制为0x,如果超过范围直接报错

4
将三个数字全部转为10禁止打印到控制台
  number1为十进制,输出本身
  number2前置0,为8进制,转化为20进制后为54输出
  number3同为8进制但是超过了8进制最大数字7,因此去掉前导0,变为99
何为8进制:
  只有8个手指的文明所用的进制(据说龙是四爪),因为更多的数不过来,逢8进1,如人类十个手指所以用10进制(0~9),逢10进一

  • js中可以保存+0、-0,但是相等
  • 浮点数

有小数点且小数点后必须至少一位数字,小数点之前可以没有但不推荐此种写法

var floatNumber1 = 1.2;  //正确
var floatNumber2 = 0.1;  //正确
var flaotNumber3 = .1;   //有效但不推荐
var floatNumber4 = 10.0; //自动转换成整数

可采用科学记数法,如
var number5 = 3.456e7;//3.456×10⁷
5
浮点数最高精度是17位小数,但是计算精度远远不如整数,比如下图
6
原文解释为:这是基于IEEE754数值的浮点计算的通病,其他采用此标准的也是如此

  • 数值范围
    ES能表示的最小数字保存在Nunber.MIN_VALUE中,最大数字为Number.MAX_VALUE中,如果超过这个数,自动转换为Infinity(正无穷)、-Infinity(负无穷)
    Infinity不能参加计算
    isFinite()判断是否为有穷,如下图
    1

NaN

  • NaN,即非数字(Not a Number)

  • NaN与任何值都不相等,包括自己
    很好理解,NaN为一种状态,不是数字,感觉有点像疯起来自己都打

  • isNaN可用于判断是否为数字,不是数字返回true
    2

  • 可用于对象,先调用valueOf(),若不能转化为数字,再调用toString()方法进行判断

数值转换

  • Number()、ParseInt()、parseFloat()都能将非数值转化为数值

  • Number()可用于任何数据类型,字面理解转化为数字

  • ParseInt()、parseFloat()用于字符串转数字,字面理解转化为整数,浮点数

  • Number转换规则
    Boolean: true=>1,false=>0
    数字:我是打酱油的,不要管我
    null:=>0
    undefiend:=>NaN
    字符串
      1.只有数字,包括小数=>直接变成十进制数字,并忽略前置0
      2.十六进制=>十进制;如 "0xf"
      3.空串=>0
      4.其他=>NaN

    对象:先调用valueOf(),若果为NaN就再调用toString(),然后进行字符串判断(所以说搞对象就是麻烦啊)
    一元加操作符("+")和Number操作相同
    3

  • parseInt(),常用
    忽略前置空格
    第一个字符非数字或负号=>NaN
    空字符串返回NaN(Number返回0,神经病)
    前为数字,后为非数字,识别数字并转换,所以小数点也会被忽略
    5
    ES3和ES5对八进制字面量字符串解析存在分歧,如上图070分别得出了70和56,解决此种问题可传入第二个参数解决
    var num = parseInt("070", 10); //结果都为70

  • parseFloat()
    与parseInt()类似
    只有第一个小数点有效,第二个以后忽略
    始终忽略前置0
    小数点后为0会转化为整数
    只支持十进制
    6

String类型

  • 可由单双引号表示,但不能混合使用('我是字符串'、"我也是字符串")
  • 字符字面量
    也叫转义序列,用于表示非打印字符,或其他用途,常用如下
字面量 含义 助记翻译(个人猜测,可能有错)
\n 换行 new linew
\t 制表 table
\b 退格 backspace
\r 回车 carriage return
\f 进纸 formfeed
\ 斜杠 xieGang
' 单引号 danYinHao
" 双引号 ShuangYinHao

7

  • 字符串特点
    不可变,改变值就需要摧毁之后用心的填充,这个过程是在后台进行的,所以老版本浏览器拼接字符串很慢
var lang = "Java";
lang = lang + "Script";
  • 转换为字符串
    第一种,toString()
    1.数值,布尔,对象,字符串(返回字符串副本)都有toString()方法,那null和undefined咋办呢,后面有(哈哈5+1种数据类型)
    2.数值可传进制参数
    3.不知道是不是Null和undefined可用String() (没有to),String()规则如下
    有toString()就调用,此处以包含数值,布尔,对象,字符串等数据类型
    null和undefined分别返回"null","undefined",数据类型已包含完
    1
      如图,String()将所有的变量都转化为了字符串,而toString()在遇到str5(null)就报错了,后面的代码也就停止执行了,因此只报了一个错
      所以String()和toString的区别在于,String()适用范围更广,toString()遇到null和undefined直接挂掉

Object类型

  • ECMAScript中的对象是一组数据和功能的集合
  • 用new操作符新建对象
var obj1 = new Object();//我是一个对象
var obj2 = new Object;  //我也是一个对象,但不推荐这么写

Object的每个实例都具有以下属性和方法

  • constructor:保存着用于创建荡秋千对象的函数
  • hasOwnProperty(propertyName):用于检查给定的属性再当前对象中(而不是实例原型)是否存在,参数propertyName必须为字符串,如obj1.hasOwnProperty("name")
  • isPrototypeOf(Object):用于检查传入参数是否为当前对象的原型(第五章讨论原型)
  • propertyIsEnumberable(propertyName):检查给定属性能否用for-in来枚举(本章后面讨论),参数必须为字符串
  • toLocalString():返回对象的字符串表示,该字符串与执行环境的地区对应
  • toString():返回对象的字符串表示
  • valueOf():返回对象的字符串、数值或者布尔值表示,通常与toString()返回值相同
  • 具体内容到第五六章详解


收起 >>
第三章 基本概念 中(数据类型)