ทั้งคู่ควรอ้างอิงวัตถุเดียวกันหรือไม่
ทั้งคู่ควรอ้างอิงวัตถุเดียวกันหรือไม่
คำตอบ:
ตาม W3C พวกเขาเหมือนกัน ในความเป็นจริงเพื่อความปลอดภัยของเบราว์เซอร์ข้ามคุณควรใช้มากกว่าwindow.location
document.location
window.location
) โดยไม่ต้องให้เหตุผลใด ๆ หากคุณจะไม่ให้เหตุผลทำไมทุกคนควรใช้คำแนะนำของคุณ? คำตอบของ Christoph นั้นมีประโยชน์มากกว่าในเรื่องนี้
วิธีที่เป็นที่ยอมรับในการรับวัตถุตำแหน่งปัจจุบันคือwindow.location
(ดูหน้า MSDN นี้ตั้งแต่ปี 1996และW3C ฉบับร่างจากปี 2549 )
เปรียบเทียบสิ่งนี้กับdocument.location
ซึ่ง แต่เดิมส่งคืน URL ปัจจุบันเป็นสตริงเท่านั้น (ดูหน้านี้บน MSDN ) น่าจะเป็นที่จะหลีกเลี่ยงความสับสนdocument.location
ถูกแทนที่ด้วยdocument.URL
(ดูที่นี่ใน MSDN ) ซึ่งเป็นส่วนหนึ่งของDOM ระดับ 1
เท่าที่ฉันรู้เบราว์เซอร์ที่ทันสมัยทั้งหมดdocument.location
จะจับคู่กับwindow.location
แต่ฉันยังคงชอบwindow.location
ที่เป็นสิ่งที่ฉันใช้ตั้งแต่ฉันเขียน DHTML ครั้งแรกของฉัน
window.location
มันไม่ถูกต้องหรือที่จะใช้location
?
window
วัตถุ ดังนั้นตัวแปรหรือฟังก์ชั่นที่คุณกำหนดที่ระดับบนสุดของสคริปต์ของคุณเป็นคุณสมบัติของวัตถุที่อ้างอิงโดยwindow
ซึ่งเกิดขึ้นเป็นวัตถุทั่วโลก วัตถุทั่วโลกเป็นนัยเมื่อขาดเช่นwindow.
- จึงถูกตีความว่าจะเป็นlocation
window.location
Caveats - fe if(an_undefined_variable)
จะโยนข้อผิดพลาดหากไม่ได้กำหนดตัวแปร - if(window.an_undefined_variable)
จะไม่เกิดขึ้น
window.locationอ่าน / เขียนบนเบราว์เซอร์ที่เข้ากันได้ทั้งหมด
document.locationเป็นแบบอ่านอย่างเดียวใน Internet Explorer (อย่างน้อย) แต่อ่าน / เขียนในเบราว์เซอร์ที่ใช้ Gecko (Firefox, SeaMonkey)
document.location
อ่านได้อย่างเดียวใน IE ฉันสามารถกำหนดให้สำเร็จใน IE 10, 9, 8 และ 6 (โดยใช้ VM จากmodern.ie )
console.log(location);
? !!
document.location
เดิมเป็นคุณสมบัติแบบอ่านอย่างเดียว แต่เบราว์เซอร์ Geckoช่วยให้คุณสามารถกำหนดได้ เพื่อความปลอดภัยข้ามเบราว์เซอร์ให้ใช้window.location
แทน
อ่านเพิ่มเติม:
น่าสนใจถ้าคุณมีเฟรมรูปภาพหรือฟอร์มชื่อ 'ตำแหน่งที่ตั้ง' ดังนั้น 'document.location' จะให้การอ้างอิงไปยังหน้าต่างเฟรมรูปภาพหรือฟอร์มตามลำดับแทนที่จะเป็นวัตถุตำแหน่ง เห็นได้ชัดว่านี่เป็นเพราะการค้นหาชื่อคอลเล็กชัน document.forms, document.images และ window.frames มีความสำคัญมากกว่าการแมปไปยัง window.location
<img name='location' src='location.png'>
if (document.location.tagName == 'IMG') alert('Hello!')
window.location
และdocument.location
ไม่สามารถแรเงาใน Chrome หรือ Firefox
เท่าที่ฉันรู้ทั้งสองเหมือนกัน เพื่อความปลอดภัยของเบราว์เซอร์ข้ามคุณสามารถใช้มากกว่าwindow.location
document.location
เบราว์เซอร์ที่ทันสมัยทั้งหมดแมปdocument.location
กับwindow.location
แต่ฉันยังคงชอบwindow.location
ที่เป็นสิ่งที่ฉันใช้ตั้งแต่ฉันเขียนหน้าแรก มันสอดคล้องกันมากขึ้น
คุณยังสามารถเห็นdocument.location === window.location
ผลตอบแทนtrue
ซึ่งชี้แจงว่าทั้งสองเหมือนกัน
document.location === window.location
ผลตอบแทน true
ด้วย
document.location.constructor === window.location.constructor
คือ true
หมายเหตุ: เพิ่งทดสอบกับ, Firefox 3.6, Opera 10 และ IE6
===
และ==
เทียบเท่า
"abc" == new String("abc")
ผลตอบแทนtrue
ในขณะที่ผลตอบแทน"abc" === new String("abc")
false
==
และ===
เทียบเท่า ดูข้อมูลจำเพาะส่วนที่ 11.9.3 และ 11.9.6 สำหรับค่าที่ไม่ใช่ค่า Null, ไม่ใช่ค่ากำหนด, ไม่ใช่ตัวเลข, ไม่ใช่บูล, ไม่ใช่ค่าสตริงที่มีชนิดเดียวกัน==
พฤติกรรมจะถูกควบคุมโดย 11.9.3 ส่วนที่ 1f และ===
พฤติกรรมตาม 11.9.6 ส่วนที่ 7 ซึ่งอ่านค่าส่งคืนtrue
หาก x และ y หมายถึงวัตถุเดียวกัน false
มิฉะนั้นกลับ
document.location
และwindow.location
จะชี้ไปที่วัตถุ คุณพลาดจุดรวมของสามเท่ากับ ใช้ 2 เท่ากับไม่ได้พิสูจน์ว่าพวกเขาเป็น obj เดียวกัน เราควรใช้ 3 เท่ากับและไม่เท่ากับ 2 เพราะ 2 เท่ากับจะให้ค่าบวกเท็จ บนเบราว์เซอร์โดย document.location เป็นสตริง URL เท่ากับwindow.location.toString()
จากนั้นdocument.location==window.location
จะคืนค่าจริงขณะที่document.location===window.location
จะคืนค่าเท็จ
document.location === window.location
เปรียบเทียบ ความจริงที่ว่าการ.constructor
เปรียบเทียบถูกโยนด้วยวิธีที่มากเกินไปฉันคิดว่าคำตอบนี้ยังคงฟังดูดี แต่การใช้===
จะทำให้การใช้เหตุผลง่ายขึ้น
ใช่พวกเขาเหมือนกัน มันเป็นหนึ่งในเรื่องราวที่ผ่านมามากมายใน JS API ของเบราว์เซอร์ ลองทำ:
window.location === document.location
window.location มีความสอดคล้องที่น่าเชื่อถือมากขึ้นในสองเรื่องนี้โดยพิจารณาจากเบราว์เซอร์รุ่นเก่า
ทุกวันนี้ยากที่จะเห็นความแตกต่างเนื่องจาก html 5 ไม่รองรับเฟรมเซตอีกต่อไป แต่เมื่อถึงเวลาที่เรามี frameset, document.location จะเปลี่ยนเส้นทางเฉพาะเฟรมที่โค้ดถูกประมวลผลและ window.location จะเปลี่ยนเส้นทางหน้าทั้งหมด
ฉันจะบอกว่า window.location
เป็นวิธีที่น่าเชื่อถือมากขึ้นในการได้รับในปัจจุบันURL ต่อไปนี้เป็นความแตกต่างระหว่างwindow.location
และdocument.url
ที่มาก่อนหนึ่งในสถานการณ์ที่ฉันได้ต่อท้ายพารามิเตอร์แฮชใน URL และอ่านในภายหลัง
หลังจากเพิ่มพารามิเตอร์แฮใน URL
ในเบราว์เซอร์รุ่นเก่าฉันไม่สามารถรับพารามิเตอร์แฮชจาก URL โดยใช้document.url
แต่เมื่อฉันใช้window.location
แล้วฉันก็สามารถรับพารามิเตอร์แฮชได้จาก URL
window.location
ดังนั้นก็มักจะดีกว่าที่จะใช้
document.URL
- มันเป็นเรื่องเกี่ยวกับและwindow.location
document.location
ยังdocument.url
ไม่มีอยู่ = ควรเป็นตัวพิมพ์ใหญ่
document.location.constructor === window.location.constructor
คือ true
เป็น
เป็นเพราะมันเป็นวัตถุเดียวกับที่คุณเห็น document.location===window.location
ก็เพราะมันเป็นเหมือนวัตถุเดียวกันในขณะที่คุณสามารถดูได้จาก
ดังนั้นไม่จำเป็นต้องเปรียบเทียบคอนสตรัคเตอร์หรือคุณสมบัติอื่นใด
อย่างน้อยใน IE มันมีความแตกต่างเล็กน้อยในไฟล์ในเครื่อง:
document.URL จะส่งคืน "ไฟล์: // C: \ projects \ abc \ a.html"
แต่ window.location.href จะส่งคืน "file: /// C: /projects/abc/a.html"
หนึ่งคือแบ็กสแลช, หนึ่งคือฟอร์เวิร์ดสแลช
ใช่พวกมันเหมือนกัน แต่ .... !
window.location
ไม่ทำงานบนเบราว์เซอร์ Internet Explorer บางตัว
แม้จะมีผู้คนส่วนใหญ่แนะนำที่นี่ แต่เป็นวิธีที่โพรโทคอลไดนามิกของGoogle Analyticsดูเหมือนเป็นเวลานาน (ก่อนที่พวกเขาจะย้ายจาก ga.js ไปยัง analytics.js เมื่อเร็ว ๆ นี้):
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
ข้อมูลเพิ่มเติม: https://developers.google.com/analytics/devguides/collection/gajs/
ในเวอร์ชันใหม่พวกเขาใช้ '//' เพื่อให้เบราว์เซอร์สามารถเพิ่มโปรโตคอลโดยอัตโนมัติ:
'//www.google-analytics.com/analytics.js'
ดังนั้นหากGoogleชอบdocument.locationไปwindow.location
เมื่อพวกเขาต้องการโปรโตคอลใน JS ผมคิดว่าพวกเขามีเหตุผลบางอย่างที่
โดยรวมแล้ว : โดยส่วนตัวแล้วฉันเชื่ออย่างนั้นdocument.location
และwindow.location
เหมือนกัน แต่ถ้ายักษ์ที่มีสถิติมากที่สุดเกี่ยวกับการใช้งานเบราว์เซอร์เช่นGoogleโดยใช้document.locationฉันแนะนำให้ติดตามพวกเขา
จริง ๆ แล้วฉันสังเกตเห็นความแตกต่างของโครเมี่ยมระหว่างทั้งสองตัวอย่างเช่นถ้าคุณต้องการทำการนำทางไปยังเฟรม sandboxed จากเฟรมลูกคุณสามารถทำได้เพียงแค่ใช้ document.location แต่ไม่ใช่กับ window.location