[译] Javascript初学者需要知道的十件事
原文:http://www.quora.com/JavaScript/What-are-the-top-ten-things-a-beginner-must-know-about-JavaScript
1. Javascript没有类的概念。一般使用原型链继承(prototypal inheritance)来模拟类。
2. 除了null和undefined之外的任何数据类型都能表现成Object (behave like an object),包括Number类型和Function类型。
var n = 42; function f() { alert("foo"); }; alert("n is " + n.toString()); // "n is 42" alert(f.name + " is a function"); // "f is a function"
注意,是“表现为object”,而不是“是object”。事实上,number, string和boolean是基本类型(primitives),除了这三个之外的都可以算作object,比如一个正则表达式也是一个object。 当需要访问基本类型变量的属性时,那些基本类型变量将被临时转换成object。 例如:
"foobar".big(); // is equivalent to new String("foobar").big(); 3.14.toFixed(); // is equivalent to new Number(3.14).toFixed()
另外,不能强行给基本类型变量(number, string, boolean)加上私有属性。
var a = "mystring", b = new String( "mystring" ); Object.defineProperty( b, 'foo', { value: 42, enumerable: false }); console.log(b.foo); // 42 Object.defineProperty( a, 'foo', { value: 42, enumerable: false }); // TypeError: Object.defineProperty called on non-object // trying another way: a.foo = 42; // remember, this is equivalent to: // new Number(a).foo = 42; // …so the 'foo' property is defined on the wrapper, not on 'a' console.log(a.foo); // undefined
3. 如果变量名前不加上var,那么这个变量就是全局的。
function setGlobal() { a = 42; } function setLocal() { var b = 23; } setGlobal(); alert(a); // 42 setLocal(); alert(b); // ReferenceError: b is not defined
4. this指针是由调用函数赋予的, 而不是由被调函数自身定义的。 例如:
var a = {}, b = {}; a.foo = 42; b.foo = 18; a.alertFoo = function() { alert(this.foo); }; a.alertFoo(); // 42 a.alertFoo.call(b); // 18
5. 严格的相等判断应该使用===。例如 :
0 == false 为真, 但是 0 === false 为假。
6. 0, undefined, null, "", NaN 都是假值 (falsy)。
这些值全都等同于false,但他们之间不能相互替换。
7. 变量声明会被提升到当前作用域的顶端。 例如:下述代码中,你认为调用foo函数会返回什么?
var a = 2; function foo() { return a; var a = 5; }
它将返回undefined。 上述代码等同于下述代码:
var a = 2; function foo() { var a; // 'a' declaration is moved to top return a; a = 5; }
另一个例子: 下述代码中,调用函数foo后变量a的值是什么?
var a = 42; function foo() { a = 12; return a; function a(){} }
答案是42。因为foo函数中变相声明了a变量,因此a成了局部变量了。
function foo() { function a() {} // local 'a' is a function a = 12; // local 'a' is now a number (12) return a; // return the local 'a' (12) }
8. 参数在函数声明中可以省略, 例如:
function hello(name, age) { alert("Hello "+name+", you’re "+age+" years old!"); } hello("Anon", 42); // "hello Anon, you’re 42 years old!" hello("Baptiste"); // "hello Baptiste, you’re undefined years old!" hello("Bulat", 24, 42); // "hello Bulat, you’re 24 years old!"
9. 对于字符串,使用双引号""和单引号''的效果是一样的。
10. Javascript代码可以在浏览器环境之外运行, 比如在Terminal或者HTTP服务器上。(例如 Node.js)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?