原语的Literal vs Constructor表示法,对于初学者来说更合适?

Spe*_*rek 10 javascript constructor

所以我是我大学班级的助教,我对如何为绝对初学者程序员提供数据类型有一些分歧(其中大多数从未编程过).我的老师告诉学生他们必须严格使用构造函数来创建原始数据类型,如数字和字符串,她的理由是将JavaScript视为强类型,这样学生将习惯于未来的语言.我理解为什么,但我认为它有不好的权衡.

var num = new Number(10); // This is encouraged.

var num = 10; // This is discouraged (students will lose points for doing this).
Run Code Online (Sandbox Code Playgroud)

我的导师没有对这些进行区分,并且学生被告知将他们视为原始的数字,弦乐等等.虽然我相信至少对于那些datatype.valueOf()在必要时不知道更好使用的初学者,并且不知道到目前为止还有什么东西.文字符号(并且我认为它)更合适和更标准,另一种方式会引起混淆.由于构造函数符号存在一致性问题,因为它们是对象(我不希望学生担心这一点).例如,这些对初学者没有意义:

var num1 = new Number(1);
var num2 = new Number(1);

if(num1 === num2) ... ; // Does not run.    

if(num1 == num2) ... ; // Does not run.

if(num1 == 1) ... ; // But this does.    

var num2 = new Number(2);

if(num1 < num2) ... ; // So does this.

switch(num1){
    case 1:
        ...  // Does not run.
        break;
    default:
        ... // This runs
        break;
}
Run Code Online (Sandbox Code Playgroud)

正如你所看到的那样,对于那些只是在学习是什么的人来说,这会if statement让人感到困惑.我觉得她好像鼓励不良行为并且不鼓励好的做法.那么你认为原始值的文字和构造函数符号之间有什么看法,它被认为是更标准/更合适的,哪个更适合初学者使用?

Der*_*會功夫 6

new Number(1)并且1不一样.第一个是a Object,后者是a Number.

var num = new Number(1);
typeof num;    //object

var num = 1;
typeof num;    //number
Run Code Online (Sandbox Code Playgroud)

为了获得构造函数创建的对象的值,必须valueOf 每次都使用以获得正确的结果.

if( new Boolean(false) ){            if( new Boolean(false).valueOf() ){
    console.log("True");                 console.log("True");
}else{                               }else{
    console.log("False");                console.log("False");
}                                    }

//> True                             //> False
//Student Be Like:                   //Student Be Like:
// What?! That doesn't even make     //Okay that makes sense.
// sense!
Run Code Online (Sandbox Code Playgroud)

由于使用构造函数只会使更多的学习者感到困惑并且会在程序的进一步开发中引起更多问题,因此永远不应该使用IMO原语构造函数.(在某些情况下除外.)

此外,每次声明变量时使用构造函数都会极大地影响执行速度,因为为新对象分配空间所需的时间比简单的64位浮点数要长.以下是比较:http://jsperf.com/constructors-vs-literalss

TL;博士

var num = new Number(10);  // bad, never do this, prone to errors

var num = 10;              // do this instead
Run Code Online (Sandbox Code Playgroud)

每当有文字并且你不使用它时:很可能是错误的代码.

new Boolean(false);    // bad
new String("foo");     // bad
new Object();          // not as bad as the ones above, but still bad
new Array(10);         // bad, it initializes the array with
                       //  not-your-normal `undefined`
Run Code Online (Sandbox Code Playgroud)


Som*_*ens 6

作为一个花费额外时间main在每个Python程序中创建函数的人,以便public static void main在时机成熟时我们为Java做更多的准备,在学习如何编程时,有一个稍微不那么好的实践.

现在老师自己,在JavaScript中使用构造函数不是那个地方.首先,它导致控制流程的不当行为,这是编程开始步骤的重要部分.其次,它通过在Web开发人员的工具包中错误地教授基本语言而使学生感到不适.最后,它没有为构造函数准备一个! 作为旁注,JavaScript并不容易陷入任何典型的编程范式,因此不适合作为四年制大学课程中的第一语言(在本作者看来).

构造函数阻止了解控制流

首先,让我们看一下控制流程.如果没有控制流,初学者可能永远无法构建比复杂更复杂的东西Hello world.这是绝对必要的初学者可以在控制流篮每个项目有深刻的理解.一个好的教练会为每种类型的几个例子,还有的区别是什么之间的充分解释truetruthy.

构造函数完全破坏了初学者对控制流的理解,如下例所示:

var myBool = new Boolean(false);
if (myBool) { console.log('yes'); } // 'yes' is logged to the console.
Run Code Online (Sandbox Code Playgroud)

是的,这是JavaScript的"wat"时刻之一.这种语言应该这样吗?可能不是.可以?绝对.初学者需要看到对初学者有意义的简单例子.首次出发时,边缘情况没有脑空间.像这样的例子只对教授应该教的人不利.

构造函数在JavaScript中没有位置

这一个更基于意见.需要注意的是:JavaScripters可能会发现构造函数在使用它们之间进行转换(即Number('10'))时会有一些用处,但通常有更好的方法.

实际上,每次在JavaScript中使用构造函数时,都会被误用.我想的是,如果想要一个字面数字,那就写出来.不需要所有额外的输入,更不用说使用构造函数的各种类型冲突和隐藏的陷阱](/sf/answers/25861531/).

值得注意的是,JSLint和JSHint(由比我更聪明的人编写)都不鼓励以这种方式使用构造函数.

  • 我有两个想法.一方面,JS中的陷阱数量使它非常不适合作为第一语言.另一方面,在基于类的OO语言之后学习JS使得理解原型继承哲学更加困难.我想我的理想进展是Scheme - > JS - > Proper OO(例如Ruby/Java):但我可能完全错了.当你教JS时,根据Crockford的*JavaScript:好的部分*来教它,以避免疣. (2认同)