Javascript 原语的文字符号与构造函数符号,哪一种更适合初学者?

Javascript 原语的文字符号与构造函数符号,哪一种更适合初学者?,javascript,constructor,Javascript,Constructor,所以我是我大学一个班级的助教,我对如何为初学者程序员(大多数以前从未编程过的程序员)呈现数据类型有点意见分歧。我的老师告诉学生,他们必须严格使用构造函数来创建原始数据类型,如数字和字符串,她的理由是将JavaScript视为强类型,这样学生将习惯于未来的语言。我明白为什么,但我认为它有不好的权衡 var num = new Number(10); // This is encouraged. var num = 10; // This is discouraged (students will

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

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

var num = 10; // This is discouraged (students will lose points for doing this).
我的老师没有对这些进行区分,并告诉学生将它们视为原始数字、字符串等。尽管我相信至少对于初学者来说,他们不知道在必要时更好地使用
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;
}
var num1=新编号(1);
var num2=新编号(1);
如果(num1==num2);//不跑。
如果(num1==num2);//不跑。
如果(num1==1);//但这是真的。
var num2=新编号(2);
如果(num1
正如你所看到的,对于一个刚刚知道什么是
if语句的人来说,这会让人感到困惑。我觉得她在鼓励坏习惯,而不鼓励好习惯。那么,对于原语值的字面符号和构造函数符号,您认为哪一种更标准/合适,哪一种更适合初学者使用呢

新号码(1)
1
不一样。第一个是
对象
,后一个是
数字

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

var num = 1;
typeof num;    //number
为了获得构造函数创建的对象的值,必须每次使用
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!
由于使用构造函数只会让更多的学习者感到困惑,并且会在程序的进一步开发中造成更多的问题,所以永远不要使用IMO原始构造函数。(某些情况下除外。)

此外,每次声明变量时使用构造函数将极大地影响执行速度,因为为新对象分配空间所需的时间比简单的64位浮点数要长。以下是比较:

tl;博士

每一次当有一个文字,你不使用它:很可能是坏代码

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`

作为一个花费额外时间在每个Python程序中创建
main
函数的人,我们可以为Java的
public static void main
做更多的准备,在学习如何编程方面,有一个比最佳实践略少的地方

现在我自己是一名教师,在JavaScript中使用构造函数不是那个地方。首先,它会导致控制流的错误行为,这是编程开始步骤的重要部分。其次,它对学生造成了伤害,因为它错误地教授了web开发人员工具包中的一种基本语言。最后,它没有为构造函数准备一个!作为旁注,JavaScript不容易落入任何典型的编程范式,因此不适合作为四年大学课程的第一语言(在本文作者看来)

构造函数阻止了对控制流的理解 首先,让我们看看控制流。没有控制流,初学者可能永远无法构造比
Hello world
更复杂的东西。对于初学者来说,对控制流程篮中的每个项目都有一个扎实的理解是绝对必要的。一位好的讲师将为每种类型提供几个示例,并全面解释
true
truthy
之间的区别

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

var myBool = new Boolean(false);
if (myBool) { console.log('yes'); } // 'yes' is logged to the console.
是的,这是JavaScript的一个时刻。语言应该这样做吗?可能不会。是吗?绝对地初学者需要看一些简单的例子,这些例子对新手来说是有意义的。刚开始时,没有大脑空间容纳边缘病例。像这样的例子只会对教授应该教的人造成伤害

构造函数在JavaScript中没有位置 这一个有点基于观点。需要注意的是:JavaScripter在使用构造函数在类型之间转换时可能会用到构造函数(例如,
Number('10')
),但通常有更好的方法

实际上,每次在JavaScript中使用构造函数都是一种误用。我认为,如果一个人想要一个文字数字,就把它写出来。不需要所有额外的类型,更不用说使用构造函数产生的各种类型冲突和隐藏的陷阱]()


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

初学者与否,都更喜欢原语。 我认为这个问题与Java中的原语或装箱原语问题没有什么不同

使用原语更简单、更具表现力:数字、布尔值或字符串,尽管JavaScript中可用的对象是对象而不仅仅是值。引用Efficient Java中的Joshua Bloch的一句话:“对象除了其值之外还有标识。”当您引用数字对象时,它与数字值不同。当我们处理一个数字时,它的价值是我们通常担心的。原语保存额外的effo
var myBool = new Boolean(false);
if (myBool) { console.log('yes'); } // 'yes' is logged to the console.
Object.prototype.getObject = function () {
    return this;
};

var yes = true.getObject();
var answer = 42..getObject();
var greet = "hello".getObject();
console.log(new Number(42) === new Number(42)); // false
console.log(new Number(42).valueOf() === new Number(42).valueOf()); // true
console.log(42 === 42); // true