๋ค๋ฅธ ๋ฐฐ์ด ๋ฒ์ฃผ ๋ฐฉ๋ฒ๊ณผ ๋ฌ๋ฆฌ ๋ฐฐ์ด์ด ์๋ ๊ฐ์ ๋ํ ๋ฐฐ์ด ์ฒด์ธ ๋ฐฉ๋ฒ ์ค๋ฅ.
_().pop(); // error
_('').pop(); // error
_().first() // undefined
์ด๊ฒ์ ๋ ๋ค๋ฅธ ๋ฌธ์ ๋ฅผ ์ผ๊ธฐํฉ๋๋ค. ๋ฐฐ์ด๊ณผ ์ ์ฌํ ๊ฒ์ ๋ฐฐ์ด๋ก ์บ์คํ ํด์ผ ํฉ๋๊น?
_('hello').first() // 'h'
_('hello').pop() // ?
์ด๊ฒ์ ์ฌ์ ํ โโ๋ฌธ์ ์ธ ๊ฒ ๊ฐ์ต๋๋ค - 1.8.3 t0 1.9.0์์ ์ฐ๋ฆฌ ๋ฒ์ ์ ๋ฒํ ํ์ ๋ฐ์ํ์ต๋๋ค.
ํธ์ง: 1.9.1์์ ์์ ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ ๋ค๋ฉด ์ด ๋ฌธ์ ๋ฅผ ๊ณ์ ์ด์ด ๋์ด์ผ ํฉ๋๊น?
์ด ๋์์ ์ฌ์ ํ โโ1.10.2์ ์กด์ฌํฉ๋๋ค.
๋ ๋ค ์ ์๋ฆฌ์์ ๊ฐ ์์ ์ ํฌํจํ๊ธฐ ๋๋ฌธ์ ๋ด ์ต์ ์์ ์ฝ๊ฐ ๋ ์ค๋๋ ฅ ์๋ ๋์กฐ:
Object.assign(undefined, {a: 1}) // error
_().extend({a: 1}) // undefined
Array.prototype.push.call(undefined, 1) // error
_().push(1) // error
๋๋ ์ด๊ฒ์ด ์ผ๊ด์ฑ์ด ์๋ค๋ ๋ฐ ์ด๋ ์ ๋ ๋์ํฉ๋๋ค.
์ด๋ค ์ข ๋ฅ์ ์ค์ ์ํฉ์์ ์ด๊ฒ์ด ๊ฐ์ฅ ๋ง์ด ๋ฐ์ํ ์ ์์ผ๋ฉฐ ๊ทธ๋ฌํ ๊ฒฝ์ฐ์ ๋ํ๋ ๊ฐ์ฒด์ ๋ํด ๋ฌด์์ ๊ธฐ๋ํ ์ ์๋์ง ๊ณ ๋ คํด ๋ณผ ๊ฐ์น๊ฐ ์์ต๋๋ค.
์ฒด์ธ์ ์ค๊ฐ ์์ ๋ํ๋ ๊ฐ์ฒด๋ ์์ธก ๊ฐ๋ฅํฉ๋๋ค. ์๋ฅผ ๋ค์ด ์๋ ์ฒด์ธ์์ push
์ ์ ๋ฌ๋๋ ๋ํ๋ ๊ฐ์ฒด๋ Array
๋๋ undefined
์
๋๋ค. ์ด๋ฌํ ์ด์ ๋ก Array
๋ํผ ๋ฉ์๋๋ null ๊ฒ์ฌ๋ฅผ ๊ตฌํํด์ผ ํ๋ค๊ณ ์ฃผ์ฅํฉ๋๋ค. ์ด๊ฒ์ ์ฌ์์.
_.chain(something).map(f).push(x) // hoping to push x to an array
์์ธก๋ ๋ํ๋ ๊ฐ์ฒด๊ฐ ๋ฐฐ์ด์ด ์๋ ๋ค๋ฅธ ๊ฒ์ผ ๊ฐ๋ฅ์ฑ์ด ๋ ๋์ผ๋ฉด ํ๋ฆผ์์ด ํ๋ก๊ทธ๋๋จธ ์ค๋ฅ์ผ ์ ์์ต๋๋ค. ๋๋ ๊ทธ ๊ฒฝ์ฐ์ ์์ธ๋ฅผ ๋์ง๋ ๊ฒ์ ์ ๊ฒฝ ์ฐ์ง ์๋๋ค.
_.chain(something).map(f).join('').push(x) // hoping to push x to a string??
์ฒด์ธ์ ์์ ๋ถ๋ถ์์ ์ด์ผ๊ธฐ๋ ์ธ๋ป๋ณด๊ธฐ์๋ ์ฝ๊ฐ ๋ค๋ฅด๊ฒ ๋ณด์ผ ์ ์์ง๋ง ๋์ผํ๋ฉฐ null ์ฒดํฌ๋ก ๋จ๊ฒจ ๋์ด์ผํ๋ค๊ณ ์ฃผ์ฅํฉ๋๋ค. ์ ์ด๋ ํ๋ก๊ทธ๋๋จธ๋ something
๊ฐ ๊ฐ๋ณ ๋ฐฐ์ด๊ณผ ๋น์ทํ ๊ฒ์ผ๋ก ์์ํ ์ ์๋ ์ด๋ค ์ด์ ๊ฐ ์์ด์ผ ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด push
๋ฅผ ํธ์ถํ ์ด์ ๊ฐ ์๊ธฐ ๋๋ฌธ์
๋๋ค.
function giveMeAMutableArraylike(something) {
_.chain(something).push(x)
}
something
๊ฐ ๊ฐ๋ณ ๋ฐฐ์ด๊ณผ ์ ์ฌํ๋ค๋ ๊ธฐ๋๋ ๋ค์ํ ์ด์ ๋ก ์ถฉ์กฑ๋์ง ์์ ์ ์์ต๋๋ค.
giveMeAMutableArraylike
๋ ์ด๋ค ์ด์ ๋ก๋ null
๋๋ undefined
๋ก ํธ์ถ๋์์ต๋๋ค. ์ด๊ฒ์ ์ฒซ ๋ฒ์งธ chain-in-the-middle ์์ ์ ๋น์ทํ๋ฉฐ ๋์ผํ null ๊ฒ์ฌ๋ก ํด๊ฒฐํ ์ ์์ต๋๋ค.giveMeAMutableArraylike
๊ฐ ๋ถ๋ช
ํ ํ ์ ์๋ ์ผ, ์ฆ ๊ณ์ฝ ์๋ฐ์ ํ๋๋ก ํ๋ ค๊ณ ํฉ๋๋ค. ์ด๊ฒ์ ๋ ๋ฒ์งธ chain-in-the-middle ์์ ์ ๋น์ทํฉ๋๋ค. ์ด ๊ฒฝ์ฐ์๋ ์ค๋ฅ๋ฅผ ๋์ง๋ ๊ฒ์ ๊ด์ฐฎ๋ค๊ณ ์๊ฐํฉ๋๋ค.something
๋ ๋จ์ผ ์์๊ฐ ์๋ ๋ฐฐ์ด ๋์ ์์ํ ๊ฐ์
๋๋ค. ์ฆ, v
[v]
์
๋๋ค. ์ด๊ฒ์ ๋ง์ JavaScript API์์ ์ผ๋ฐ์ ์ธ ์ํฉ์
๋๋ค. giveMeAMutableArraylike
์ ๊ณ์ฝ์ด ์ด๋ฅผ ํ์ฉํ๋ค๋ฉด v
๊ฐ ๋ฌด์์ด๋ ์๊ด์์ด ์ค๋ฅ๋ฅผ ๋์ง๋ ๊ฒ์ ๋ถ๋ช
ํ ์๋ชป๋ ๊ฒ์
๋๋ค.ํ์์ ๊ฒฝ์ฐ Underscore๋ giveMeAMutableArraylike
๊ฐ ๋จ์ผ ๋ฒ ์ด ์์๋ฅผ ํ์ฉํ๋์ง ์ฌ๋ถ๋ฅผ ์ ์ ์์ผ๋ฏ๋ก giveMeAMutableArraylike
์ ํ๋ก๊ทธ๋๋จธ๊ฐ ํน์ ๊ณ์ฝ์ ๊ตฌํํด์ผ ํฉ๋๋ค. Underscore์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๊ฐ๋ฅํ ๋ชจ๋ ๊ณ์ฝ์ ๋ํด ์ฌ๋ฐ๋ฅธ ์์
์ ์ํํ ์ ์๋ ๊ฒ์ ์์ต๋๋ค.
| ํ์ฌ ํ๋ | ๋จ์ผ ์์ ๋ฐฐ์ด๋ก ๋ํ
---|---|---
๊ณ์ฝ์ ๋ฒ ์ด ๋จ์ผ ์์๋ฅผ ํ์ฉํฉ๋๋ค | _ํ๋ก๊ทธ๋๋จธ๊ฐ ๊ฐ์
ํด์ผ ํฉ๋๋ค_ | ๋ฐ์ค์ ์๋์ผ๋ก ์ฌ๋ฐ๋ฅธ ์์
์ ์ํํฉ๋๋ค.
๊ณ์ฝ์ ๋ฒ ์ด ๋จ์ผ ์์๋ฅผ ํ์ฉํ์ง ์์ต๋๋ค | ๋ฐ์ค์ ์๋์ผ๋ก ์ฌ๋ฐ๋ฅธ ์์
์ ์ํํฉ๋๋ค | _ํ๋ก๊ทธ๋๋จธ๊ฐ ๊ฐ์
ํด์ผ ํฉ๋๋ค_
๋ํ ๊ฐ์ ๋ํํด์ผ ํ๋์ง ์ฌ๋ถ๋ฅผ ์ด๋ป๊ฒ ๊ฒฐ์ ํฉ๋๊น? ์ผ๋ถ ๊ณ์ฝ์ Array
๊ฐ ์๋ ๋ชจ๋ ๊ฒ์ ๋ํํ๋ ค๊ณ ํ ์ ์์ง๋ง ๋ค๋ฅธ ๊ณ์ฝ์ arguments
๋ฐ ์ผ๋ฐ ๊ฐ์ฒด๋ฅผ ์๋ ๊ทธ๋๋ก ์ ๋ฌํ๊ธฐ๋ฅผ ์ํ ์ ์์ต๋๋ค. ๋ค์ ๋งํ์ง๋ง ์ด๊ฒ์ Underscore์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ฌ์ฉ์๋ฅผ ๋์ ํ์ฌ ์ถ์ธกํ ์ ์๋ ๊ฒ์
๋๋ค.
๋ ์ด๊ตญ์ ์ธ ์ํฉ๋ ์๊ฐํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋ฌธ์์ด๊ณผ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ ๋ฐฐ์ด๊ณผ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ํ์ฉํ๊ณ ๋จผ์ Array
๋ก ๋ณํํ๋ ๊ณ์ฝ์ด ์์ต๋๋ค. ๊ฐ๋ฅํ ๋ชจ๋ ๋ณํ์ ํฌ๊ดํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค. ์ต์ ๋ณ๊ฒฝ ์์น์ ๋ฐ๋ผ ์ด๋ฏธ ์ง์๋ ๊ณ์ฝ์ ํฌ์์ํค๋ฉด์ ์ผ๋ถ ๊ณ์ฝ์ ์ง์ํ๋ ๊ฒ์ ๋ํ ์ค๋๋ ฅ ์๋ ์ฃผ์ฅ์ด ์์ต๋๋ค. ๊ตฌํ์ ๊ฐ๋ฅํ ํ ์ต์ํํด์ผ ํ๋ ๊ฐ๋ ฅํ ๊ฒฝ์ฐ๋ ์์ต๋๋ค.
๋ฐ๋ผ์ ์ฌ๋ฐ๋ฅธ ์๋ฃจ์
์ null ๊ฒ์ฌ๋ง ์ฝ์
ํ๊ณ ๊ทธ๋๋ก ๋๋ ๊ฒ์
๋๋ค. ์ด๊ฒ์ ์๊ฐํ ์ ์๋ ๋ชจ๋ ์ํฉ์์ ๋ฐฉ์ดํ ์ ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ Underscore์ ๋์์ ๋ํ ์ ์ผํ ๋ณ๊ฒฝ์ด๋ฉฐ _.extend
์ ๋์๊ณผ๋ ์ผ์นํฉ๋๋ค. ๋ ๊ฒ์ฌ๋ ์ฌ์ ํ ๋ฒ๊ทธ ์์ ์ผ๋ก ๊ฐ์ฃผ๋ ์ ์์ง๋ง ๊ทธ ์ด์์ ์ํํ๋ฉด ์ ์ํ๊ฒ ์์์ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ผ๋ก ์ ํ๋ฉ๋๋ค.
@jashkenas ์ด๊ฒ์ ๋ํด ๋น์ ๋ฐํ ์ ์์ต๋๊น? ๋์ํ์๋ฉด null ์ฒดํฌ๋ฅผ ๊ตฌํํ๋ pull request๋ฅผ ์ค๋นํ๊ฒ ์ต๋๋ค.
@jgonggrijp โ null ๊ฒ์ฌ๋ก ๊ตฌํํ๋ ค๋ ๋์์ ํ๋ ๋ฌธ์ฅ์ผ๋ก ์์ธํ ์ค๋ช ํ ์ ์์ต๋๊น?
null ๊ฐ์ ๋ํด ํธ์ถ๋ ๋ ๋ฐฐ์ด ๋ฉ์๋๊ฐ ๋ช ์์ ์ผ๋ก ์์ธ๋ฅผ throwํฉ๋๊น? ์๋๋ฉด nullish ๊ฐ์ด ํธ์ถ๋ ๋ ํ์๋ฆฌ๋ฅผ ํ์ง ์์๊น์?
@jashkenas ๋ค. ๋ด๊ฐ ๊ตฌํํ ๋์์ Underscore ๋ฐฐ์ด ํจ์์ ์คํ์ผ์ ๋ฐ๋ฅด๋ no-op์ ๋๋ค.
length
์ํ๊ฐ ํ์ํ์ง ์๋ค๋ ์ ์ ์ ์ธํ๊ณ ๋
if (obj == null) return chainresult(this, obj);
์ด ๋ ์ค ์ฌ์ด:
ํ๋ฌ์ค ํ ์คํธ๋ ๋ฌผ๋ก ์ด๊ณ ์ด๋ฌํ ํ ์คํธ์์ ํ์์ฑ์ด ๋๋ฌ๋ ๊ฒฝ์ฐ ์ด ์ค ์ ์ ๋ฉ์๋๋ฅผ no-op์ผ๋ก ๋ฐ๊พธ๋ null ๊ฒ์ฌ๋ ํ ์ ์์ต๋๋ค.
๋์๊ฒ ์ ๋ค๋ฆฐ๋ค!
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ด๊ฒ์ ๋ ๋ค๋ฅธ ๋ฌธ์ ๋ฅผ ์ผ๊ธฐํฉ๋๋ค. ๋ฐฐ์ด๊ณผ ์ ์ฌํ ๊ฒ์ ๋ฐฐ์ด๋ก ์บ์คํ ํด์ผ ํฉ๋๊น?