类型和语法--原生原型

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>
  <script>
    // var a = new String('abc');
    // console.log(a);  // String {0: "a", 1: "b", 2: "c", length: 3, [[PrimitiveValue]]: "abc"}
    // console.log(typeof a); // object
    // console.log(a instanceof String);  // true

    // ----------------------------------------------------------------------------------------------
      // new String("abc") 创建的是字符串 "abc" 的封装对象,而非基本类型值 "abc"。

      // 在 JavaScript 中,判断一个变量的类型尝尝会用 typeof 运算符,
      // 在使用 typeof 运算符时采用引用类型存储值会出现一个问题,
      // 无论引用的是什么类型的对象,它都返回 "object"。
      // ECMAScript 引入了另一个 Java 运算符 instanceof 来解决这个问题。
      // instanceof 运算符与 typeof 运算符相似,用于识别正在处理的对象的类型。与 typeof 方法不同的是,
      // instanceof 方法要求开发者明确地确认对象为某特定类型。例如:
    // ----------------------------------------------------------------------------------------------

    // console.log(Object.prototype.toString.call( [1,2,3] )); // "[object Array]" 
    // console.log(Object.prototype.toString.call( /regex-literal/i )); // "[object RegExp]"
    // Object.prototype.toString.call( "abc" ); // "[object String]" 
    // Object.prototype.toString.call( 42 ); // "[object Number]" 
    // Object.prototype.toString.call( true ); // "[object Boolean]"

    // ----------------------------------------------------------------------------------------------
      // Object.prototype.toString:查看内部属性 [[Class]]
    // ----------------------------------------------------------------------------------------------

    // var a = new String( "abc" ); 
    // var b = new Number( 42 ); 
    // var c = new Boolean( true ); 
    // console.log(a.valueOf()); // "abc" 
    // console.log(b.valueOf()); // 42 
    // console.log(c.valueOf()); // true

    // ----------------------------------------------------------------------------------------------
      // valueOf:得到封装对象中的基本类型值
    // ----------------------------------------------------------------------------------------------
    // ************* 在需要用到封装对象中的基本类型值的地方会发生隐式拆封。 *************

    // ========================================================================================================
    // Array(..)
      // var a = new Array(1, 2, 3);
      // console.log(a);  // [1, 2, 3]

      // var b = new Array(1);
      // console.log(b);  // length: 1;length被设置成了指定的值为1

      // var a = new Array(3);
      // var b = [undefined, undefined, undefined];
      // var c = [];
      // c.length = 3;
      // console.log(a);  // [undefined × 3] length: 3
      // console.log(b);  // [undefined, undefined, undefined]
      // console.log(c);  // [undefined × 3] length: 3

      // var a = Array.apply( null, { length: 3 } ); 
      // console.log(a); // [ undefined, undefined, undefined ]

    // ----------------------------------------------------------------------------------------------
      // Array 构造函数只带一个数字参数的时候,该参数会被作为数组的预设长度(length),而 非只充当数组中的一个元素。
      // 我们将包含至少一个“空单元”的数组称为“稀疏数组”。
      // ,join(..) 首先假定数组不为空,然后通过 length 属性值来遍历其中的元 素。而 map(..) 并不做这样的假定
    // ----------------------------------------------------------------------------------------------

    // ========================================================================================================
      // var c = new Object(); 
      // c.foo = "bar"; 
      // console.log(c); // { foo: "bar" } 

      // var d = { foo: "bar" }; 
      // console.log(d); // { foo: "bar" } 

      // var e = new Function( "a", "return a * 2;" ); 
      // console.log(e);  // function anonymous(a) {return a * 2;}

      // var f = function(a) { return a * 2; } 
      // console.log(f);  // function (a) { return a * 2; }

      // function g(a) { return a * 2; } 
      // console.log(g);  // function g(a) { return a * 2; }

      // var h = new RegExp( "^a*b+", "g" ); 
      // console.log(h);  // /^a*b+/g

      // var i = /^a*b+/g;
      // console.log(i);  // /^a*b+/g

    // ----------------------------------------------------------------------------------------------
      // 没有必要使用 new Object() 来创建对象,因为这样就无法像常量形式那样一 次设定多个属性,而必须逐一设定。
    // ----------------------------------------------------------------------------------------------

    // ========================================================================================================
    // Date(..) 和 Error(..) 
      // if (!Date.now) {
      //   Date.now = function(){      
      //     console.log((new Date()).getTime());   
      //     return (new Date()).getTime();
      //   }; 
      // }

      // var myDate = new Date(); // Wed Jul 10 2019 14:23:04 GMT+0800 (中国标准时间)
      // myDate.getYear(); //获取当前年份(2位)
      // myDate.getFullYear(); //获取完整的年份(4位,1970-????)
      // myDate.getMonth(); //获取当前月份(0-11,0代表1月)
      // myDate.getDate(); //获取当前日(1-31)
      // myDate.getDay(); //获取当前星期X(0-6,0代表星期天)
      // myDate.getTime(); //获取当前时间(从1970.1.1开始的毫秒数)
      // myDate.getHours(); //获取当前小时数(0-23)
      // myDate.getMinutes(); //获取当前分钟数(0-59)
      // myDate.getSeconds(); //获取当前秒数(0-59)
      // myDate.getMilliseconds(); //获取当前毫秒数(0-999)
      // myDate.toLocaleDateString(); //获取当前日期
      // var mytime=myDate.toLocaleTimeString(); //获取当前时间
      // myDate.toLocaleString( ); //获取日期与时间


      // 对Date的扩展,将 Date 转化为指定格式的String
      // 月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符, 
      // 年(y)可以用 1-4 个占位符,毫秒(S)只能用 1 个占位符(是 1-3 位的数字) 
      // 例子: 
      // (new Date()).Format("yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423 
      // (new Date()).Format("yyyy-M-d h:m:s.S")      ==> 2006-7-2 8:9:4.18 

      // Date.prototype.Format = function (fmt) {
      //     var o = {
      //         "M+": this.getMonth() + 1, //月份 
      //         "d+": this.getDate(), //日 
      //         "H+": this.getHours(), //小时 
      //         "m+": this.getMinutes(), //分 
      //         "s+": this.getSeconds(), //秒 
      //         "q+": Math.floor((this.getMonth() + 3) / 3), //季度 
      //         "S": this.getMilliseconds() //毫秒 
      //     };
      //     if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
      //     for (var k in o)
      //     if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
      //     return fmt;
      // }

      // // 调用: 
      // var time1 = new Date().Format("yyyy-MM-dd");
      // var time2 = new Date().Format("yyyy-MM-dd HH:mm:ss");
      // console.log(time1);  // 2019-07-10
      // console.log(time2);  // 2019-07-10 14:44:04

    // ----------------------------------------------------------------------------------------------
      // 创建日期对象必须使用 new Date()。Date(..) 可以带参数,用来指定日期和时间,而不带 参数的话则使用当前的日期和时间。
    // ----------------------------------------------------------------------------------------------

    // ========================================================================================================
    // Symbol
    // var mysym = Symbol( "my own symbol" ); 
    // console.log(mysym);              // Symbol(my own symbol) 
    // console.log(mysym.toString());   // "Symbol(my own symbol)" 
    // console.log(typeof mysym);       // "symbol" 

    // var a = { }; 
    // a[mysym] = "foobar"; 
    // console.log(Object.getOwnPropertySymbols( a )); // [ Symbol(my own symbol) ]

    // ----------------------------------------------------------------------------------------------
      // ES6 中新加入了一个基本数据类型 ——符号(Symbol)。符号是具有唯一性的特殊值(并 非绝对),用它来命名对象属性不容易导致重名。
      // 符号并非对象,而是一种简单标量基本类型。
    // ----------------------------------------------------------------------------------------------
      

    // ========================================================================================================
    // 原生原型
    var a = ' abcdefg ';
    console.log(a.indexOf('e'));  // 5
    console.log(a.charAt(3));  // c
    console.log(a.substr(1, 4));  // abcd
    console.log(a.toUpperCase());  // " ABCDEFG "
    console.log(a.trim());  // "abcdefg"

    // ----------------------------------------------------------------------------------------------
      // String# === String.prototype;
      // • String#indexOf(..) 在字符串中找到指定子字符串的位置。
      // • String#charAt(..) 获得字符串指定位置上的字符。
      // • String#substr(..)、String#substring(..) 和 String#slice(..) 获得字符串的指定部分。  
      // • String#toUpperCase() 和 String#toLowerCase() 将字符串转换为大写或小写。
      // • String#trim() 去掉字符串前后的空格,返回新的字符串。
      // 以上方法并不改变原字符串的值,而是返回一个新字符串。

      // Number#tofixed(..)(将 数字转换为指定长度的整数字符串)和 Array#concat(..)(合并数组)
    // ----------------------------------------------------------------------------------------------


    // 小结
    // JavaScript 为基本数据类型值提供了封装对象,称为原生函数(如 String、Number、Boolean 等)。
    // 它们为基本数据类型值提供了该子类型所特有的方法和属性(如:String#trim() 和 Array#concat(..))。
    // 对于简单标量基本类型值,比如 "abcdefg",如果要访问它的 length 属性或 String.prototype 方法,
    // JavaScript 引擎会自动对该值进行封装(即用相应类型的封装对象来包装它)来实现对这些属性和方法的访问。
  </script>
</body>
</html>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,744评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,505评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,105评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,242评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,269评论 6 389
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,215评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,096评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,939评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,354评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,573评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,745评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,448评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,048评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,683评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,838评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,776评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,652评论 2 354

推荐阅读更多精彩内容