zoukankan      html  css  js  c++  java
  • 读《JavaScript面向对象编程指南》(一)

    第二章 基础

    通常认为在JavaScript中主要包括五种基本数据类型:
    数字、字符串、布尔值、undefined、null。
    任何不属于上述五种基本类型的值都被认为是一个对象。

    null和undefined:通常认为null是它自有类型Null的唯一一个成员,undefined是预定义的全局变量(与null不同,它不是关键字),只读,它也是这个类型的唯一成员,如果试图访问某个不存在的或者未经赋值的变量时,就会得到一个undefined值。
    有时候执行某种算术运算时,null和undefined的结果会截然不同。

    另:typeof (null) 返回 object,被公认为是历史遗留错误。

    关于NULL

    以前只知道在C/C++中代表指针指向空的含义,发现在JS中居然是一种primitive type,有点吃惊,再一搜,发现在Java中也提到这是一种类型,只不过没有name,以前

    没有注意到。

    在C/C++中只是一个简单的宏定义,注意C++11倡导用 nullptr 代替NULL。

    而在Java和JS中,我觉得还是直接看文档吧,把文档贴在这里(虽然文档的描述读起来很别扭):

    其实 Java和 JS中的 null 本质上还是代表空指针而已,只不过在高级语言中封装一下,甚至把它单独作为一个类型列出来。

    绝大部分值在转换为布尔类型时都为true,但以下6种falsy值除外:
    "" null undefined 0 NaN false

    一点联想:Java和C++中都有引用的概念,当然它们本质上都是指针,但是侧重点不太一样,C++中的是Type* const型的指针,侧重“引用即别名”,而 Java 中

    侧重“对象的引用”(数组可看成一种特殊的对象),Java中的引用更类似于C++中的指针,尤其它们都与 new 连用。实际上,我好像记得轮子哥说过,引用其实就是

    C++中的语法糖。

    所以可以说Java中的指针(引用)只能指向对象,而不是像C++中可以指向primitive type,JS中自然也是如此。所以在上面的JS文档中:

     The value null represents the intentional absence of any object value.

     此外,像传值或者传引用这类老掉牙的问题我早就懂了,另:一切传引用本质上也是传值。

    又一点联想:C++中的NULL和Java中的null有何区别?参考:Stackoverflow

    Note:

    (1)NaN == NaN false
    (2)惰性求值:true || "some" true;
    true && "some" "some";

    typeof会返回一个代表数据类型的字符串,它的值包括:"number","string","boolean","undefined","object"和"function"。

    第三章 函数

    函数也是数据。

    匿名函数,回调函数,自调函数,内部函数,返回函数的函数,能重写自己的函数。

     1 例子:
     2 var a = function() {
     3     function someSetup(){
     4         var setup = 'done';
     5     }
     6     function actualwork(){
     7         alert('Worky-worky');
     8     }
     9     someSetup();
    10     return actualwork;
    11 }();

    闭包:

     1 function f(){
     2     var b = "b";
     3     return function(){
     4         return b;
     5     }
     6 }
     7 
     8 var n = f(); n();
     9 
    10 var n;
    11 function f(){
    12     var b = 'b';
    13     n = function(){
    14         return b;
    15     }
    16 }
    17 
    18 function f(arg){
    19     var n = function(){
    20         return arg;
    21     }
    22     arg++;
    23     return n;
    24 }
    25 
    26 var m = f(123);
    27 m();

    循环中的闭包:

     1 function f(){
     2     var a = [];
     3     for(var i = 0;i < 3;i++){
     4         a[i] = function(){
     5             return i;
     6         }
     7     }
     8     return a;
     9 }
    10 
    11 var m = f();
    12 m[0]();
    13 m[1]();
    14 m[2]();
    15 
    16 function f(){
    17     var a = [];
    18     for (var i = 0; i < 3; i++) {
    19         a[i] = (function(x){
    20             return function(){
    21                 return x;
    22             }
    23         })(i);
    24     }
    25     return a;
    26 }
    27 
    28 function f(){
    29     var a = [];
    30     for(var i = 0; i < 3; i++){
    31         (function(arg){
    32             a[i] = function(){
    33                 return arg;
    34             }
    35         })(i);
    36     }
    37 }
    38 
    39 fucntion f(){
    40     function makeClosure(x){
    41         return function(){
    42             return x;
    43         }
    44     }
    45     var a = [];
    46     for(var i = 0; i < 3; i++){
    47         a[i] = makeClosure(i);
    48     }
    49     return a;
    50 }

    Getter和Setter:

     1 var getValue, setValue;
     2 (function(){
     3     var serect = 0;
     4     getValue = function(){
     5         return serect;
     6     };
     7     setValue = function(v){
     8         serect = v;
     9     };
    10 })()

    迭代器:

    1 function setup(x){
    2     var i = 0;
    3     return function(){
    4         return x[i++];
    5     }
    6 }
    7 var next = setup(['a', 'b', 'c']);

    第四章:对象

    构造器函数

    1 function Hero(name){
    2     this.name = name;
    3     this.occupation = 'Ninja';
    4     this.whoAreYou = function(){
    5         return "I'm" + this.name + " and I'm a " + this.occupation;
    6     }
    7 }
    8 var h1 = new Hero('lyrecxn');
    9 h1.whoAreYou();

    全局对象


    构造器属性(constructor property)

    instanceof操作符 测试一个对象是否由某个指定的构造器函数所创建的。

    function C2(){this.a = 1; return {b : 2};}
    var c2 = new C2();

    内建对象:
    数据封装类对象——包括Object、Array、Bollean、Number和String。这些对象代表着JavaScript不同的数据类型,并且都拥有各自不同的typeof返回值,以及undefined 和 null 状态。

    工具类对象——包括Math、Date、RegExp等用于提供便利的对象。

    错误类对象——包括一般性错误对象以及其他各种更特殊的错误类对象。

    Object:
    toString()方法、valueOf()方法、constructor属性

    Array:
    相当于属性名从 0 开始递增,并自动生成数值。
    length属性
    sort()方法、join()方法、slice()方法等

    Function:
    三种定义函数的方式,
    属性:constructor、caller、prototype
    方法:call()、apply()
    重新认识arguments对象,function.argument

    Boolean、Number、Math、Date:

    String:
    toUpperCase()与toLowerCase()、charAt、indexOf()。
    slice()与substring()(对待负值的方式不同)
    split()、concat()

    RegExp:
    属性:global,ignoreCase,multiline,lastIndex,source.前三个可以用regex修饰符来表示:gim。
    方法:test(),exec().

    以正则表达式为参数的字符串方法:match()、search()、replace()、split()

    1 例子:
    2 var email = "stoyan@phpied.com";
    3 var username = email.replace(/(.*)@.*/ , "$1");
    4 >>>username;
    5 "stoyan"

    回调式替换:

    1 //回调式替换
    2 var s = new String("HelloJavaScript")
    3 function replaceCallback(match){
    4     return "_" + match.toLowerCase();
    5 }
    6 s.replace(/[A-Z]/g, replaceCallback);

    Error:

     try catch throw finally

  • 相关阅读:
    字符串转换为整数
    解决.Net 3.1 alpine镜像无法连接Sql server的问题
    微信小程序之wepy自动化架构搭建(fly+wepy-plugin-replace)
    node+express+socket.io+mysql=通讯服务器搭建(一)
    vuejs学习——vue+vuex+vue-router项目搭建(二)
    vuejs学习——vue+vuex+vue-router项目搭建(一)
    vuejs学习——vue+vuex+vue-router项目搭建(三)
    vuejs学习--递归组件(树型表格分享)
    Simditor学习--vuejs集成simditor
    前端学习——实现事件代理
  • 原文地址:https://www.cnblogs.com/niuxichuan/p/6475654.html
Copyright © 2011-2022 走看看