美文网首页Javascript高级程序设计 读书笔记
Javascript 引用类型(Boolean Number S

Javascript 引用类型(Boolean Number S

作者: Sue1024 | 来源:发表于2018-02-21 22:06 被阅读25次

    基本包装类型

    我们会经常对基本类型值作如下操作:

    var str = "string";
    str.substring(2); // "ring"
    

    基本类型不是对象,没有属性和方法,那substring()是从哪里来的呢?
    原来我们在执行第二行时,后台会自动完成如下过程:

    var s1 = new String("string");
    var s2 = s1.substring(2);
    s1 = null;
    

    Boolean类型

    Boolean类型是与布尔值相对应的引用类型。

    var falsy= new Boolean(false);
    truth.valueOf(); // false
    truth.toString(); // "false"
    falsy&& true; // true
    Boolean(falsy); //true
    

    由于falsy是一个对象,因此转化为布尔值时为true

    Number 类型

    Number类型是与数值对应的引用类型。

    var num = 10;
    num.valueOf(); //12
    num.toString(); // "12" 
    num.toString(2); // "1100"
    
    toFixed()

    toFixed()可以按照指定的小数位数返回数值的字符串表示,如果指定的小数位数小于原有位数,则四舍五入。

    var num = 10.252;
    num.toFixed(6); // "10.252000"
    num.toFixed(2); // "10.25"
    num.toFixed(1); // "10.3"
    
    toExponential()

    toExponential()可以将数值转化为具有指定小数位数的科学技术法。

    var num = 1234567;
    num.toExponential(2); // "1.23e+6"
    
    toPrecision()

    toPrecision()可以格式化数值,传入希望输出的数值位数(计算位数时不考虑指数)。

    var num = 99;
    num.toPrecision(1); // "1e+2"
    num.toPrecision(3); // "99.0"
    

    String 类型

    String类型是与字符串相对应的引用类型。

    var str = "string";
    str.toString(); // "string"
    str.valueOf(); // "string"
    str.length; // 6
    

    每个String实例都有length属性,表示一个字符串中包含的字符量,注意字符串中的双字节字符视为一个字符。

    访问特定位置的字符
    • charAt()
      接受一个参数,表示要访问的字符在字符串中基于0的位置,返回指定位置的单字符字符串(ECMAScript中没有单字符类型)
    var str = "name";
    console.log(str.charAt(2)); // "m"
    
    • charCodeAt()

    接受一个参数,表示要访问的字符在字符串中基于0的位置,返回指定位置的字符对应的字符编码字符串(ECMAScript中没有单字符类型)

    var str = "name";
    console.log(str.charCodeAt(2)); // "109"
    
    • []
      在IE8、Firefox、Safari、Chrome、Opera浏览器中,还支持方括号访问个别字符的语法:
    var str = "name";
    console.log(str[2]); // "m"
    
    字符串操作方法
    • concat()
      用于将一个或多个字符串拼接起来形成一个新的字符串。
    var str1 = "Hello";
    var str2 = "World";
    str1.concat(" ", str2, "!"); // "Hello World"
    str1; // "Hello"
    
    • +
      concat的功能相同,但更加简便。
    "Hello" + " " + "World" + "!"; // "Hello World"
    
    • slice() substr() substring()
      这三个方法都可以基于子字符串返回新字符串,都接受1个或2个参数,第一个都表示子字符串的起始位置,slice()substring()的第二个参数指定子字符串最后一个字符后面的位置,substr的第二个参数指定的是字符个数,这三个方法对原始字符串不会产生影响。
    var str = "Hello World!"; 
    console.log(str.slice(3)); // "lo World!"
    console.log(str.substr(3)); // "lo World!"
    console.log(str.substring(3)); // "lo World!"
    console.log(str.slice(3, 6)); // "lo "
    console.log(str.substr(3, 6)); // "lo Wor"
    console.log(str.substring(3, 6)); // "lo "
    

    以上的例子传入的参数均是正值,如果传入负值,它们的表现就不会那么一致了。

    var str = "Hello World!"; 
    console.log(str.length);
    console.log(str.slice(-3)); // "ld!" -3 被转换成9
    console.log(str.slice(9)); // "ld!"
    console.log(str.substr(-3)); //"ld!" -3 被转换成9
    console.log(str.substr(-3)); // "ld!"
    console.log(str.substring(-3)); // "Hello World!" -3被转换成0
    console.log(str.substring(0)); // "Hello World!"
    console.log(str.slice(3, -8)); /  / "l" -8 被转换为4
    console.log(str.slice(3, 5)); // "l"
    console.log(str.substr(3, -8)); // "" -8 被转换为0
    console.log(str.substr(3, -8)); // ""
    console.log(str.substring(3, -10)); // "Hel" -10被转化为0,由于0<3,0成为第一参数
    console.log(str.substring(0, 3)); // "Hel"
    

    如果slice()的参数为负值,它会使用字符串长度与它们相加,如果相加后的结果为正,则返回相应子字符串,如果结构为负,则转换为0。
    substr()slice()对待第一个参数的方式相同,当substr()的第二个参数也为负值时,它会直接将这个负值转换为0。
    substring会将小于0的参数都转换为0,然后比较两个参数的大小,最后将较小的参数作为第一个参数,较大的参数作为第二个参数。

    • trim()
      创建一个字符串的副本(不影响原字符串),删除前置和后缀空格。
      IE 9+、Safari 5+、Firefox 3.5+、Opera 10.5+、Chrome都支持这个方法,chrome 8+、Firefox 3.5+、Safari 5+还支持trimLeft()trimRight(),分别用于删除字符串开头和末尾的空格。
    访问指定位置的字符串
    • indexOf(str, index)
      从字符串开头搜索给定字符串str,返回子字符串的位置,如果没有搜到,返回-1, index表示开始搜索的位置。
    • lastIndexOf(str, index)
      从字符串尾部搜索给定字符串str,返回子字符串的位置,如果没有搜到,返回-1,index表示开始搜索的位置。
      书中提到了一个可以遍历字符串,找到所有匹配子字符串的方法:
    var str = "abcdabcabcdefabcddabcedfsd";
    var position = new Array();
    var pos = str.indexOf("d");
    while(pos > -1) {
      position.push(pos);
      pos = str.indexOf("d", pos + 1);
    }
    console.log(position); // [3, 10, 16, 17, 22, 25]
    
    大小写转换

    toLowerCase() toUpperCase() toLocaleUpperCase() toLocaleLowerCase()

    模式匹配
    • match()
      与之前提到过的RegExp.exec()本质是一样的,接受的参数要么是正则表达式,要么是RegExp对象,返回一个数组,数组第一项是匹配项,之后是捕获组匹配的字符串。
    var str = "abcdabc";
    var pattern = /ab(c)/;
    str.match(pattern); // ["abc", "c", index: 0, input: "abcdabc"]
    
    • seach()
      接收正则表达式或RegExp对象,返回字符串中从开头查找到的第一个匹配项的索引,如果找不到,返回-1。
    var str = "abc";
    var pattern = /a/;
    str.search(pattern); // 0
    
    • replace()
      接受两个参数,第一个表示需要匹配的字符串或正则表达式,第二个表示要替换成的内容,可以是字符串或函数,如果第一个参数是字符串,只会替换掉第一个匹配的内容,如果要替换所有匹配的内容,应该使用正则表达式,并加添加g标志。返回被替换后的字符串,不改变原字符串。
    var str = "abcabcdabdabe";
    str.replace("abc", "abcd"); //"abcdabcdabdabe"
    str.replace(/abc/g, "a");
    
    1. 如果第二个参数是字符串
      此时,不仅可以使用普通字符串来替换第一个参数匹配到的内容,也可以使用一些特殊的字符序列,将正则表达式得到的值插入到结果字符串中。
    字符序列 替换文本
    $$ $
    $& RegExp.lastMatch
    $' RegExp.leftContext
    $` RegExp.rightContext
    $n 第n个捕获组的字符串
    $nn 第nn个捕获组的字符串

    举一些例子:

    var str = "cat, bat, sat, fat";
    result = str.replace(/(.at)/g, "word ($1)")
    "word (cat), word (bat), word (sat), word (fat)"
    result = str.replace(/(.at)/g, "word ($')")
    "word (, bat, sat, fat), word (, sat, fat), word (, fat), word ()"
    result = str.replace(/(.at)/g, "word ($`)")
    "word (), word (cat, ), word (cat, bat, ), word (cat, bat, sat, )"
    result = str.replace(/(.at)/g, "word ($$)")
    "word ($), word ($), word ($), word ($)"
    result = str.replace(/(.at)/g, "word ($&)")
    "word (cat), word (bat), word (sat), word (fat)"
    result = str.replace(/(b)(at)/g, "word ($2)")
    "cat, word (at), sat, fat"
    
    1. replace() 方法的第二个参数可以是函数。在这种情况下,每个匹配都调用该函数,它返回的字符串将作为替换文本使用。该函数的第一个参数是匹配模式的字符串。接下来的参数是与模式中的子表达式匹配的字符串,可以有 0 个或多个这样的参数。接下来的参数是一个整数,声明了匹配在原字符串中出现的位置。最后一个参数是原字符串本身。
      书中提到了一个例子:
    function htmlEscape(text){
      return text.replace(/[<>"&]/g,         
        function(match, pos, originalText){
          switch(match){
            case "<":
              return "&lt;";
            case ">":
              return "&gt;";
            case "&":
              return "&amp;";
            case "\"":
              return "&quot;";
          }
      });
    }
    alert(htmlEscape("<p class=\"greeting\">Hello world!</p>"));
    //&lt;p class=&quot;greeting&quot;&gt;Hello world!&lt;/p&gt;
    

    W3C中还有一个例子,可以将所有单词的首字母转化为大写:

    name = 'aaa bbb ccc';
    uw=name.replace(/\b\w+\b/g, function(word){
      return word.substring(0,1).toUpperCase()+word.substring(1);}
    );
    

    通过第三个参数,我们可以使用不同的转义序列分别替代< > & \

    • split()
      将一个字符串基于指定分隔符分割成多个子字符串,返回子字符串构成的数组,第一个参数作为分隔符,可以是字符串,也可以是正则表达式,第二个参数可选,指定数组大小。
    var str = "Hat, Bat, Rat, Cat";
    str.split();
    //["Hat, Bat, Rat, Cat"]
    str.split(",");
    //(4) ["Hat", " Bat", " Rat", " Cat"]
    str.split(",", 2);
    //(2) ["Hat", " Bat"]
    str.split(/at/);
    //(5) ["H", ", B", ", R", ", C", ""]
    
    字符串比较方法

    localeCompare()用于比较两个字符串:
    strA.localeCompare(strB)
    如果strA < strB,返回一个负数(不一定是-1);
    如果strA > strB,返回一个正数(不一定是1);
    如果strA == strB,返回0。
    localeCompare()的比较方法因地区而异。

    fromCharCode()

    String构造函数中的静态方法,接受一个或多个字符编码,将它们转换成字符串。

    String.fromCharCode(33, 23, 3); //!��
    
    HTML方法

    下面的例子列举了可以生成标准HTML标签的方法:

    var str = "Hello World!"
    str.anchor("welcome"); //<a name="welcome">Hello World!</a>
    str.big(); //<big>Hello World!</big>
    str.bold(); //<b>Hello World!</b>
    str.fixed(); //<tt>Hello World!</tt>
    str.fontcolor("red"); //<font color="red">Hello World!</font>
    str.fontsize(12); //<font size="12">Hello World!</font>
    str.italics(); //<i>Hello World!</i>
    str.link("www.jianshu.com"); //<a href="www.jianshu.com">Hello World!</a>
    str.small(); //<small>Hello World!</small>
    str.strike(); //<strike>Hello World!</strike>
    str.sub(); //<sub>Hello World!</sub>
    str.sup(); //<sup>Hello World!</sup>
    

    内置对象

    Global

    所有全局作用域的属性和函数都是Global对象的属性

    encodeURI()encodeURIComponent()

    这两个编码方法可以使用UTF-8对URI进行编码,当我们的URI中包含某些无效字符时,可以使用这两个方法将URI转换成浏览器可以识别的字符串。

    • encodeURI()
    1. 编码范围
      ASCII字母、数字、~!@#$&*()=:/,;?+'之外的字符。
    2. 例子
    encodeURI("http://www.baidu.com/some other thing");
    "http://www.baidu.com/some%20other%20thing"
    

    可以看出,encodeURI()将空格转化为%20,返回一个可以直接被浏览器识别的URI。

    • encodeURIComponent()
    1. 编码范围
      ASCII字母、数字、~!*()'之外的字符。
    2. 例子
    encodeURIComponent("http://www.baidu.com/some other thing");
    "http%3A%2F%2Fwww.baidu.com%2Fsome%20other%20thing"
    

    可以看出encodeURIComponent()将空格、:/都进行了编码,然而返回的结果似乎是一个不可用的URI,那么这个方法有什么用呢?
    假如说我们要访问如下URI:

    https://www.baidu.com/s?://
    

    如果不进行编码,浏览器会将所有的反斜杠都视为分隔符,这显然不是我们的初衷。这种情况下,我们应对://进行编码。

    var baseURI = "https://www.baidu.com/s?wd=";
    var s = encodeURIComponent("://");
    var uri = baseURI + s;
    console.log(uri); //https://www.baidu.com/s?wd=%3A%2F%2F
    
    decodeURI()decodeURIComponent()

    有编码自然就有解码,decodeURI()只能解码encodeURI()处理过的字符串,而decodeURIComponent()则可以解码任何特殊字符的编码。
    还是上述的例子:

    decodeURI(uri)
    "https://www.baidu.com/s?wd=%3A%2F%2F"
    decodeURIComponent(uri)
    "https://www.baidu.com/s?wd=://"
    
    eval

    只接受一个参数,可执行的Javascript字符串。解析器遇到eval()时,会将参数当作实际的ECMAScript语句来解析,并且eval()中的代码被纳入调用eval()的执行环境中。

    var message = "hello";
    eval("message += ' world!'; function say(){ console.log(message);}")
    say();
    hello world!
    

    书中提到在eval()中创建的变量和函数不会被提升。但笔者试了一下,发现不是这样:

    eval("var tt='aa'; function test(){console.log(tt); var tt='dd'; console.log(tt);} test();")
    // undefined dd
    
    eval("test(); function test(){var tt='dd'; console.log(tt);}")
    // dd
    
    test();
    eval("function test(){var tt='dd'; console.log(tt);}")
    //undefined
    

    严格模式下,外部访问不到eval()中创建的函数和变量,也不可以为eval赋值。

    Global对象的其他函数

    isNaN()、isFinite()、parseInt()以及parseFloat()等。

    Global对象的属性

    • undefined NaN Infinity
    • 构造函数
      Object Array Function Boolean String Number Date RegExp Error EvalError RangeError ReferenceError SyntaxError TypeError URIError
    window

    Web浏览器中,Global对象中的变量和函数都是window对象的属性

    Math

    Math对象的属性
    属性 说明
    Math.E e
    Math.LN10 10的自然对数
    Math.LN2 2的自然对数
    Math.LOG2E 以2为底的e的对数
    Math.LOG10E 以10为底的e的对数
    Math.PI π
    Math.SQRT1_2 1/2的平方根
    Math.SQRT2 2的平方根
    min()max()

    接受多个数值参数,得到其中的最大、最小值。
    如果我们要从一个数值数组中获得最大最小值呢?可以使用apply:

    var array = [4, 5, 7, 1, 3, 10, 6];
    Math.max.apply(Math, array)
    //10
    

    需要注意的是,要将Math作为max()this

    舍入方法
    • Math.ceil():向上舍入
    • Math.round():四舍五入
    • Math.floor():向下舍入
    var num1 = 24.5, num2 = 24.4;
    Math.ceil(num1); // 25
    Math.floor(num1); // 24
    Math.round(num1); // 25
    Math.round(num2); // 24
    
    random

    返回一个大于等于0小于1的随机数。书中提到了一个从某个整数范围内随机选择一个值的方法:

    value = Math.floor(Math.random() * range + minValue)
    

    比如返回一个1到10中的一个随机整数:

    var num = Math.floor(Math.random() * 10 + 1)
    
    其他方法
    方法 说明
    Math.abs(num) 返回num的绝对值
    Math.exp(num) 返回Math.Enum次幂
    Math.log(num) 返回num的自然对数
    Math.pow(num, power) 返回numpower次幂
    Math.sqrt(num) 返回num的平方根
    Math.acos(x) 返回x的反余弦值
    Math.asin(x) 返回x的反正弦值
    Math.atan(x) 返回x的反正切值
    Math.atan2(y, x) 返回y/x的反正切值
    Math.cos(x) 返回x的余弦值
    Math.sin(x) 返回x的正弦值
    Math.tan(x) 返回x的正切值

    相关文章

      网友评论

        本文标题:Javascript 引用类型(Boolean Number S

        本文链接:https://www.haomeiwen.com/subject/oxdttftx.html