JavaScript数据类型中易被疏忽的点

String

  • 字符串中能够包含由反斜杠\和字符构成的特别字符,如\n换行,\b 退格,\f 换页,\r回车,\tTab;

var multiLine = " first \n second \n third line "
alert(multiLine) // alerts 3 lines
  • “”当作转义标记也能够防止一些问题,如

var str = 'I\'m the Valrus'
  • 当盘算字符串长度时,特别字符也会介入盘算,如:

var str = "My\n" // 3 .`\n`也算其中之一
alert(str.length)  // 3
  • javascript中的字符串只能读取不能转变;

  • javascript中有两种查找子字符串的要领,indexOflastIndexOf,返回找到的第一个字符的位置,没找到返回-1;

  • 逐位运算符~not,~n相当于 -(n+1),if ~indexOf相当于if found;

  • 获得子字符串的三种要领substr, substring, slice,能够Google找到它们之间的差异,也能够从后文链接中找到;

  • 字符串的笔记

    • 字符串逐位比较,一旦比较出大小就不再今后比较;"Bob" > "Bar" // true, because o > a,alert("2" > "14"); // true

    • 字符装换为ASCII码比较

    • 当有数值介入比较时,会把字符串也转换为数值,如alert(2 > "14"); // false

Number, Math

  • JavaScript中的数值采纳双精度(IEEE 754),每个数占8byte;

  • JavaScript能够辨认十六进制(0xFF),八进制(010)以及科学计数要领的数字(3e5);

  • Infinity-Infinity是两个特别的值,它们大于或小于任何值,对它们举行运算后依旧会获得Infinity,两者相除会获得NaN,并不会报错;

  • 当一个数学运算符不能被准确实行时会获得NaN(0/0),它不即是包含其自身的任何数值,只可有isNaN函数搜检;

  • 除了双向的加号,别的统统的运算符都会把数值情势的字符串转换为数值;alert( -"12.34" / "2" ) // -6.17;

  • 不能转换则返回NaN;

  • 一个由空白符构成的字符串会被转化为0;

  • 假如字符串首字母非数字,parseInt/parseFloat会返回NaN,alert( parseInt('a123') )//NaN;

  • JavaScript中的数值盘算存在精度问题(alert(0.1 + 0.2 == 0.3)//false)(浮点数不能被二进制准确的示意),解决要领能够先转化为整数,再除以10alert( (0.1*10 + 0.2*10) / 10 ) // 0.3,也能够运用toFixed;

Array

  • shift,pop删除对应项,并返回该项;

  • unshift,push;

  • join,split;

  • 假如给数组的length赋值低于数组现实的长度,会删除凌驾的项;

  • push,pop直接操纵末了一项,其运转速度快,效力高;

  • shift,unshift操纵第一项,须要记着全部数组,效力低;

  • 数组中的length要领(属性) 现实上是last index+1,

    var fruits = [] // empty array
    fruits[1] = 'Peach'
    fruits[99] = 'Apple'
    alert(fruits.length)  // 100 (but 2 elements)
  • 对数组也能够运用delete,然则只会删除该项的值,不会真的删除该项;

  • splice在原数组上变动和slice返回原数组的一个片断(新数组);

  • sort默许把内容转化为string,然后根据ASCII码比较;

  • new Array返回的是具有指定长度的值为空的数组;

Objects

  • obj.propobj[prop]两者都能够接见对象中的一项,然则值得注重的是obj.prop里prop是该项的称号,obj[prop]里的prop是该项的值,此时prop是字符串,应该加引号;

  • alert("key" in obj) // true, key exists运用in运算符能够用来肯定是不是存在某一项;

  • 运用for in时,子项处置惩罚递次不肯定,差异浏览器有所差异;

  • 对象中能够贮存统统范例,包含函数;

  • 能够应用对象完成链式挪用,其关键在于每次的返回值为this;

var ladder = {
  step: 0,
  up: function() {
    this.step++
    return this
  },
  down: function() {
    this.step--
    return this
  },
  showStep: function() {
    alert(this.step)
    return this
  }
}
ladder.up().up().down().up().down().showStep()  // 1
  • 运用组织函数建立对象时,var animal = new Animal()var animal = new Animal同等;

  • 运用组织函数建立对象时,其关键在于this,假如组织函数返回了一个对象则会疏忽this;

  • JS中存在Math,Date,RegExp三种内置对象,函数从某种程度上来讲也是对象,String,Number,Booleans三者比较特别,它们各自具有一些要领;

对象转换为简朴数据范例

转化为字符串

  • 假如对象中存在toString要领,且返回一个简朴范例数据,那末就返回这个字符串(统统数组默许具有,所以平常实行到此终了);

  • 默许

    alert( {key: 'value'} ) // toString for Objects outputs: [object Object]
    alert( [1,2] )          // toString for Arrays lists elements "1,2"
    alert( new Date )       // toString for Dates outputs the date as a string
  • 能够本身定义一个toString要领

    var user = {
    firstName: 'John',
    toString: function() {
      return 'User ' + this.firstName
    }
    }
    alert( user )  // User John
  • 假如存在valueOf要领,且返回一个简朴范例数据,那末返回这个;

  • alert()会触发装换为字符串

转换为数值(两种情况下发作,异常罕见)

  • 对数值举行盘算的要领( Math.sin(obj),isNaN(obj))以及运算符(+,-,*,/等等)

  • 做比较时(注:obj1==obj2,只要两者援用统一对象时才相称);Number(obj)也会转换,

  • 数值转换规则以下

    • 假如存在valueOf要领,且返回一个简朴范例数据,那末返回这个效果;

    • 假如对象中存在toString要领,且返回一个简朴范例数据,那末就返回这个字符串;

    alert( new Date() ) // The date in human-readable form
    alert( +new Date() ) // Microseconds till 1 Jan 1970
    • 本身定义一个valueOf要领

      var room = {
        num: 777,
        valueOf: function() {
          return this.num
        }
      }
      alert( +room )  // 777
    • 不存在valueOf要领,然则存在toString要领时会挪用此要领

      var room = {
        num: 777,
        toString: function() {
          return this.num
        }
      }
      alert( room / 3 )  // 259
    • 注重只须要返回简朴数值范例即可(Numeric,String,Boolean),不一定非要返回数值;

装换为布尔值

  • 装换表
    |Value | Converted to…|

true/falseno conversion
undefined, nullfalse
Number0, NaN become false, others – true.
String“” becomes false, any other – true
Objecttrue
  • 注重,字符”0″为true;

  • 涉及到逻辑运算符会触发布尔装换;

  • 然则也有比较新鲜的处所,看下面两例

  alert( [0] == 0 )  // true
  alert( "\n0\n" == 0 ) // true
  alert( "\n0\n" == false ) // true
// 
  if ([0]) alert(1)  // 1, if treats [0] as true
  if ("\n0\n") alert(2) // 2, if treats "\n0\n" as true
  • 细致想一想怎样转换的,就能够明白了。==只比较值得效果,[0],“0”装换为数值后就是0,然则当他们是数组中的一项,或字符串时并非是空的。

再看一个比较新鲜的例子

alert( [] == ![] ) // true
  • 起首,看右侧![],逻辑非对[]举行布尔转换,根据上面的装换表,数组实在也是对象,object装换为真。所以右侧![] = !true = false;

  • 再看左侧,对象与简朴范例比较时,会按数值体式格局装换,没有valueOf,将运用toString举行装换(以逗号分开的字符串)那末就装换为一个空的字符串”=false;

  • 所以两者相称;

检测一下你是不是真的控制了数值装换,看看下面的问题能不能明白

6 / "3" = 2
"2" * "3" = 6
4 + 5 + "px" = "9px"
"$" + 4 + 5 = "$45"
"4" - 2 = 2
"4px" - 2 = NaN
7 / 0 = Infinity
{}[0] = undefined
parseInt("09") = "0" or "9" // octal or decimal, depends on the browser
5 && 2 = 2
2 && 5 = 5
5 || 0 = 5
0 || 5 = 5

申明

本文对各范例并未做详实的申明,想相识更多材料能够参考以下文章

    原文作者:zhangwang
    原文地址: https://segmentfault.com/a/1190000006056285
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞